关于递归函数中最近出现的一些问题自省详解编程语言

package cn.haiyisoft18; 
 
import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 
 
public class IO_FILEPRACTICE { 
 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		//这个练习是我自己想出来的,主要存在的问题是在递归函数中 
		//new新的对象,如果函数不断进栈,就会不断的new新的对象 
		//最后导致栈内存溢出,并且在进行file对象判断的时候没有使用过滤器 
		//对对象进行判断,有可能导致添加了其他的文件 
		File file = new File("C://Users//zx//Desktop//src//java//awt"); 
		List<File> L1 = GetFileEndWithJava(file); 
		System.out.println(L1.size()); 
		for (File file2 : L1) { 
			System.out.println(file2.getName()); 
		} 
	} 
 
	public static List<File> GetFileEndWithJava(File dir) { 
		List<File> list = new ArrayList<>(); 
 
		if (dir.isFile()) 
			list.add(dir); 
		else { 
			File[] FA = dir.listFiles(new JavaFileFilter()); 
			for (File file_in : FA) { 
				if (file_in.isFile()) 
					list.add(file_in); 
				else 
					list.addAll(GetFileEndWithJava(file_in)); 
			} 
		} 
 
		return list; 
 
	} 
 
} 
 
class JavaFileFilter implements FileFilter { 
 
	@Override 
	public boolean accept(File dir) { 
		// TODO Auto-generated method stub 
		// 过滤器设计思想,只保留文件夹以及后缀名是java的文件 
		if (dir.isDirectory()) 
			return true; 
		else 
			return dir.getName().endsWith("java"); 
 
	} 
} 

package cn.haiyisoft18; 
 
import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 
 
public class IO_FILEPRACTICE2 { 
 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		File file = new File("C://Users//zx//Workspaces//MyEclipse 10//zx_project"); 
		List<File> list = new ArrayList<>(); 
		FileFilter filter = new JavaFilefilter2(".java"); 
		GetJavaFile(list, file, filter); 
		System.out.println(list.size()); 
		for (File file2 : list) { 
			System.out.println(file2.getName()); 
		} 
	} 
 
	public static void GetJavaFile(List<File> list, File dir, FileFilter filter) { 
 
		if (dir.isFile() && filter.accept(dir)) 
			list.add(dir); 
		else { 
			File[] F1 = dir.listFiles(); 
			for (File file_in : F1) { 
				if (file_in.isDirectory()) 
					GetJavaFile(list, file_in, filter); 
				else { 
					if (filter.accept(file_in)) 
						list.add(file_in); 
				} 
			} 
		} 
	} 
} 
 
class JavaFilefilter2 implements FileFilter { 
 
	private String suffxx; 
 
	public JavaFilefilter2(String suffxx) { 
		this.suffxx = suffxx; 
	} 
 
	@Override 
	public boolean accept(File pathname) { 
		// TODO Auto-generated method stub 
		return pathname.getName().endsWith(suffxx); 
	} 
 
}

package cn.haiyisoft18; 
 
import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 
 
public class IO_FILEPRACTICE3 { 
 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		File file = new File("C://Users//zx//Desktop//src"); 
		List<File> list = new ArrayList<File>(); 
		FileFilter filter = new JavaFilefilter3(".java"); 
		GetJavaFile(list, filter, file); 
		System.out.println(list.size()); 
		for (File file2 : list) { 
			System.out.println(file2.getName()); 
		} 
	} 
 
	public static void GetJavaFile(List<File> list, FileFilter filter, File dir) { 
		if (dir.isFile() && filter.accept(dir)) 
			list.add(dir); 
		else { 
			File[] FL = dir.listFiles(filter); 
			for (File file_in : FL) { 
				if (file_in.isDirectory()) 
					GetJavaFile(list, filter, file_in); 
				else 
					list.add(file_in); 
			} 
		} 
	} 
 
} 
 
class JavaFilefilter3 implements FileFilter { 
	private String suffxx; 
 
	public JavaFilefilter3(String suffxx) { 
		super(); 
		this.suffxx = suffxx; 
	} 
 
	@Override 
	public boolean accept(File file) { 
		// TODO Auto-generated method stub 
		if (file.isDirectory()) 
			return true; 
		else 
			return file.getName().endsWith(suffxx); 
 
	} 
}

这是在看毕向东视频的IO视频的时候写的三段代码,代码的主要用途是获取某文件夹及其子文件夹内后缀为suffxx的文件(后缀的英文单词写错了……),其中用到了递归函数,第一个代码是我自己写的,其中有若干问题,例如判断最开始File对象为文件时没有加判断是否为suffxx结尾的文件,会把其他文件带入到List中,但是最大的问题是在递归函数中new了ArrayList对象,以及Filefilter对象,有递归函数是不断的进栈,这样就会不断的new新的对象,最终可能导致内存溢出,所以在使用递归函数时,尽量不要在函数内new对象,应将外面的对象传入函数。

第二个代码是毕向东的代码,不多说了。

第三个代码是我将我第一个代码和第二个代码结合了一下,主要修改了new对象的部分以及过滤器的使用位置,将需要使用的对象由外部传入,减少了函数递归时不断进栈new对象的问题,我将过滤器直接传入了ListFiles()函数,这样ListFiles返回的FIle数组的长度就会变小,减少了内存的占用和循环的次数。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/17687.html

(0)
上一篇 2021年7月19日 20:26
下一篇 2021年7月19日 20:26

相关推荐

发表回复

登录后才能评论