关于递归函数中最近出现的一些问题自省

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数组的长度就会变小,减少了内存的占用和循环的次数。

posted @ 2018-05-30 01:13  明月镇魂  阅读(171)  评论(0编辑  收藏  举报