如何修改Java TreeNode代码实现目录树先输出目录后输出文件
问题原因
你当前的代码直接按File.listFiles()返回的原生顺序遍历文件列表,遇到目录就挂载、遇到文件就挂载,所以会出现同层级目录和文件穿插排列的情况。
修改点
只需要调整createDirTree和appendDirTree两个方法的遍历逻辑,拆成两次遍历:第一次遍历仅处理所有子目录,全部挂载完成后第二次遍历仅处理所有普通文件即可。
修改后代码
1. 调整createDirTree方法
public static TreeNode<File> createDirTree(File folder) { if (!folder.isDirectory()) { throw new IllegalArgumentException("folder is not a Directory"); } TreeNode<File> DirRoot = new TreeNode<File>(folder); // 先挂载所有子目录 for (File file : folder.listFiles()) { if (file.isDirectory()) { appendDirTree(file, DirRoot); } } // 再挂载所有普通文件 for (File file : folder.listFiles()) { if (!file.isDirectory()) { appendFile(file, DirRoot); } } return DirRoot; }
2. 调整appendDirTree方法
public static void appendDirTree(File folder, TreeNode<File> DirRoot) { DirRoot.addChild(folder); // 先获取当前新增的目录节点,避免重复取最后一个元素 TreeNode<File> currentDirNode = DirRoot.children.get(DirRoot.children.size() - 1); // 先挂载当前目录下的所有子目录 for (File file : folder.listFiles()) { if (file.isDirectory()) { appendDirTree(file, currentDirNode); } } // 再挂载当前目录下的所有普通文件 for (File file : folder.listFiles()) { if (!file.isDirectory()) { appendFile(file, currentDirNode); } } }
效果说明
修改后同一层级的子节点会先按目录的遍历顺序排列,再按文件的遍历顺序排列,你示例中的File1.txt、File2.txt就会排在Folder1、Folder2之后相邻展示,符合预期。
内容的提问来源于stack exchange,提问作者Richard Walker
相关产品推荐
相关产品推荐

