问题 我需要编写一个简单的软件,给出某些约束,将一系列文件追加到列表中.用户可以在两个"类型"的目录之间进行选择:一个带有*通配符,意味着它还应该探索子目录,而经典一个没有通配符,只能获取该目录中存在的文件.
我在做什么
现在我正在做最愚蠢的事情:
import java.io.File;
public class Eseguibile {
private static void displayIt(File node){
System.out.println(node.getAbsoluteFile());
if(node.isDirectory()){
String[] subNote = node.list();
for(String filename : subNote){
displayIt(new File(node, filename));
}
}
}
public static void main(String[] args){
System.out.println("ciao");
displayIt( new File("/home/dierre/") );
}
}
Run Code Online (Sandbox Code Playgroud)
我不需要构建树,因为我只需要文件列表,所以我想也许有一种更有效的方法.
我正在阅读有关TreeModel的内容,但据我了解,它只是一个实现Jtree的接口.
现在我正在做最愚蠢的事情......
递归既不"愚蠢",也不一定效率低下.实际上,在这种特殊情况下,递归解决方案可能比非递归解决方案更有效.当然,递归解决方案比替代方案更容易编码和理解.
递归的唯一潜在问题是,如果目录树在病理学上很深,你可能会溢出堆栈.
如果你真的想避免递归,那么自然的方法就是使用"文件列表堆栈"数据结构.您将在每个地方递归,将包含当前目录(剩余)File对象的列表推送到堆栈,读取新目录并开始处理它们.然后,当您完成后,弹出堆栈并继续父目录.这将为您提供深度优先遍历.如果要进行广度优先遍历,请使用"文件队列"数据结构而不是堆栈.
我的迭代解决方案:
ArrayDeque<File> stack = new ArrayDeque<File>();
stack.push(new File("<path>"));
int n = 0;
while(!stack.isEmpty()){
n++;
File file = stack.pop();
System.err.println(file);
File[] files = file.listFiles();
for(File f: files){
if(f.isHidden()) continue;
if(f.isDirectory()){
stack.push(f);
continue;
}
n++;
System.out.println(f);
}
}
System.out.println(n);
Run Code Online (Sandbox Code Playgroud)