zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

编程语言 问题 详解 关于 出现 一些 最近 递归函数
2023-06-13 09:11:48 时间
// 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数组的长度就会变小,减少了内存的占用和循环的次数。

17687.html

cjava