遍历目录而不使用递归?

die*_*rre 5 java recursion

问题 我需要编写一个简单的软件,给出某些约束,将一系列文件追加到列表中.用户可以在两个"类型"的目录之间进行选择:一个带有*通配符,意味着它还应该探索子目录,而经典一个没有通配符,只能获取该目录中存在的文件.

我在做什么

现在我正在做最愚蠢的事情:

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的接口.

Ste*_*n C 8

现在我正在做最愚蠢的事情......

递归既不"愚蠢",也不一定效率低下.实际上,在这种特殊情况下,递归解决方案可能比非递归解决方案更有效.当然,递归解决方案比替代方案更容易编码和理解.

递归的唯一潜在问题是,如果目录树在病理学上很深,你可能会溢出堆栈.

如果你真的想避免递归,那么自然的方法就是使用"文件列表堆栈"数据结构.您将在每个地方递归,将包含当前目录(剩余)File对象的列表推送到堆栈,读取新目录并开始处理它们.然后,当您完成后,弹出堆栈并继续父目录.这将为您提供深度优先遍历.如果要进行广度优先遍历,请使用"文件队列"数据结构而不是堆栈.

  • 本能的解决方案也不一定是傻瓜:-) (3认同)

Luc*_*ssi 6

我的迭代解决方案:

  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)