You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:15:06