使用堆栈在Java中制作文件/目录树
Posted
技术标签:
【中文标题】使用堆栈在Java中制作文件/目录树【英文标题】:Using stack to make file/directory tree in Java 【发布时间】:2018-10-16 10:36:40 【问题描述】:我需要使用堆栈数据结构返回或打印文件/目录树。例如:
Folder1
Folder1.1
File1.1.1
Folder1.2
Folder2
File2.1
File2.2
...
到目前为止我的代码:
public static void filetree(File mainfolder, int indent)
Stack<String> filesanddirectories = new Stack<>();
for (File file : mainfolder.listFiles())
if (file.isDirectory())
filesanddirectories.push(file.getName());
filetree(file, 0);
else if (file.isFile())
filesanddirectories.push(file.getName());
for (int i = 0; i < filesanddirectories.size(); i++)
System.out.println(filesanddirectories.pop());
此代码打印文件夹和文件,但没有缩进,向后并且不完全按照正确的顺序。
有人能解释一下它应该如何工作的逻辑吗?
编辑:找到使用递归和堆栈的解决方案(虽然堆栈似乎是不必要的)
【问题讨论】:
要使缩进工作,您需要在每次递归时向indent
值添加一些内容 - 例如 filetree(file, 0);
-> filetree(file, indent + 4);
。然后,您需要更改打印机制以使用 indent
值。
要正确打印文件名,您需要在看到文件名时打印它们。 if (file.isFile())filesanddirectories.push(file.getName());
-> if (file.isFile())System.out.println(...
.
那么打印文件和文件夹并将文件夹添加到堆栈?
你应该用递归的方法打印出来
当你有一个递归方法时使用堆栈是有点不寻常的。您确定必须使用堆栈吗?
【参考方案1】:
在递归遍历文件目录时,我使用了indent
和temp
变量来保持缩进。然后在for
循环的开始处打印缩进。
public static void filetree(File mainfolder, int indent)
int temp;
for (File file : mainfolder.listFiles())
for(int i = 0; i<indent; i++)
System.out.print(" ");
temp = indent;
if (file.isDirectory())
indent++;
System.out.println(file.getName());
filetree(file, indent);
indent--;
else if (file.isFile())
System.out.println(file.getName());
indent = temp;
【讨论】:
如果你永远不会弹出它们,那么将它们压入堆栈有什么意义?filesanddirectories.push(file.getName());
在 OP 的代码中,我只是没有删除这些行。使用堆栈对解决方案没有任何贡献。也许我应该更新我的答案。以上是关于使用堆栈在Java中制作文件/目录树的主要内容,如果未能解决你的问题,请参考以下文章