java - 使用java递归深度优先遍历文件系统

标签 java recursion filesystems

我需要使用 java 遍历随机文件系统(Windows)。

问题:它需要自下而上,因为我将数据合并在一起,并且根应该包含我的所有数据集。

这就是我到目前为止所拥有的:

private void listDir(File dir) {
    File[] files = dir.listFiles();
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            System.out.print(files[i].getAbsolutePath());
            if (files[i].isDirectory()) {
                System.out.print(" (Directory)\n");
                listDir(files[i]);  //Recursion
            }
            else {
                System.out.print(" (File)\n");
            }
        }
    }
}

那么有什么想法可以实现这一点吗?

感谢您的帮助,希望我的问题不会打扰您^^

最佳答案

一般来说,通过深度优先树递归,您可以通过更改输出语句和递归调用的顺序来影响输出的顺序。

拿这棵树:

        1
       / \
      2   3
     / \   \
    4   5   6

如果我的代码说(这个答案中的所有代码都是伪代码):

 void f(Node node) {
      if(node == null) return;
      print node.value;
      f(node.left);
      f(node.right);
 }

...然后它将输出 1 2 4 5 3 6 - 按照您头脑中的逻辑并验证这是真的。

如果我只改变语句的顺序:

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      print node.value;
      f(node.right);
 }

现在它打印 4 2 5 1 3 6 - 再次遵循逻辑并验证它是否正确。

 void f(Node node) {
      if(node == null) return;
      f(node.left);
      f(node.right);
      print node.value;
 }

... 打印 4 5 2 6 3 1 ——这可能就是你想要的。

您可能想要广度优先遍历,并且您可能希望反转输出的顺序 - Google 中有示例。

在文件系统中,有更多的子级,而不仅仅是左右,所以它更像是:

 void recursiveList(File f) { // f could be a file or a directory
      if(f is a file) {
           output file info about f
           return
      }
      // else it's a directory
      for(File entry : f.getChildren()) {
          recursiveList(entry);
      }
      output directory info about f
  }

关于java - 使用java递归深度优先遍历文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538198/

相关文章:

java - Spring +R2DBC : How to close DatabaseClient and TransactionalOperator?

java - 如何添加默认列(如createdTxStamp)并在ofbiz中读取?

java - 使用多个示例时如何在 Cucumber 功能中参数化用户名和密码

ruby - 所有可能总和的最小值、最大值、平均值和中值 (Ruby)

c - C语言读取FAT12镜像文件

linux - JFFS2中使用的算法

php - 使用 Symfony 2 Finder 组件获取子目录

java - 内部静态类的 Lombok 注释

javascript - 递归js函数简化列表结果

c++ - 递归函数——计数排列和忽略排列