如何在 Java 中将文件路径列表转换为 Hireachial 树

2024-03-13

有人可以给我一些建议吗?我想要获取文件路径列表(只是字符串)并转换为类似层次树的结构。因此有两个任务,解析字符串以创建树,以及创建树或某种映射结构以实际将结果放入其中。 (第三个任务是解析树以在 html 中显示为树)

我使用的是 Java 7,所以我假设我可以使用 Paths 来完成第一部分,但很难找到一个清晰的算法。

C:\Music\Blur\Leisure
C:\Music\KateBush\WholeStory\Disc1
C:\Music\KateBush\WholeStory\Disc2
C:\Music\KateBush\The Kick Inside   
C:\Music\KateBush\The Dreaming
C:\MusicUnprocessed\Blue\ParkLife

所以它给出了

C:\
   Music
      Blur 
          Leisure
      Kate Bush
          Whole Story
               Disc 1
               Disc 2
          The Kick Inside
          The Dreaming
    MusicProcessing
      Blur
         ParkLife

这是一个非常简单的实现,它会让您了解从哪里开始。 :-)

import java.io.PrintStream;
import java.util.Collections;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.regex.Pattern;

public class PathWalker {
    public static class Node {
        private final Map<String, Node> children = new TreeMap<>();

        public Node getChild(String name) {
            if (children.containsKey(name))
                return children.get(name);
            Node result = new Node();
            children.put(name, result);
            return result;
        }

        public Map<String, Node> getChildren() {
            return Collections.unmodifiableMap(children);
        }
    }

    private final Node root = new Node();

    private static final Pattern PATH_SEPARATOR = Pattern.compile("\\\\");
    public void addPath(String path) {
        String[] names = PATH_SEPARATOR.split(path);
        Node node = root;
        for (String name : names)
            node = node.getChild(name);
    }

    private static void printHtml(Node node, PrintStream out) {
        Map<String, Node> children = node.getChildren();
        if (children.isEmpty())
            return;
        out.println("<ul>");
        for (Map.Entry<String, Node> child : children.entrySet()) {
            out.print("<li>");
            out.print(child.getKey());
            printHtml(child.getValue(), out);
            out.println("</li>");
        }
        out.println("</ul>");
    }

    public void printHtml(PrintStream out) {
        printHtml(root, out);
    }

    public static void main(String[] args) {
        PathWalker self = new PathWalker();
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine())
            self.addPath(scanner.nextLine());
        self.printHtml(System.out);
    }
}

最初,我考虑为目录和常规文件创建单独的类,但我觉得在这种情况下,由于您想做的就是打印名称,因此使用统一的节点类使代码更易于使用,尤其是因为您可以避免实现访问者模式。

输出没有以任何特别好的方式格式化。所以如果你愿意的话,你可以调整代码;或者,如果您想要更好看的东西,您可以通过 HTML Tidy 运行输出。

我选择使用TreeMap,因此目录条目是按字典顺序排序的。如果您想使用插入顺序,只需更改为使用LinkedHashMap.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java 中将文件路径列表转换为 Hireachial 树 的相关文章

随机推荐

  • 为什么比较器应该实现可序列化?

    Java 新手 在开发 Android 应用程序时学习它 我正在实现一个比较器来对文件列表和 android 文档进行排序say http developer android com reference java util Comparat
  • System.Runtime.Serialization.InvalidDataContractException:没有设置属性的方法

    正如错误所示 我的属性没有设置器 但我不需要设置器 它应该是只读的 编辑 制作设置器internal 这仍然可以在程序集中设置 但这是一个很好的技巧 当用于位于由其他人使用的程序集中的数据对象时效果很好 因为那些使用程序集将无法设置该属性
  • 如何在所选项目上启用工作流程状态“写入”?

    由于未授予工作流状态写入权限 某些项目没有写入访问权限 当我在 Access Viewer 中单击写入权限时 访问查看器通知我 由于工作流状态写入访问权限 所选用户没有访问权限 不幸的是 我无法通过安全编辑器 手动 设置它 任何人都可以阐明
  • 使用 xpath 和 telegram 即时视图提取、创建和附加

    我怎么能够create and append below a 使用上面代码中的标签XPath and 电报即时查看 https instantview telegram org docs功能 a href https expmle com
  • 如何获得 Aptana 的代码协助以与 Google Maps API v3 配合使用?

    有一个 Google 地图 API v3Visual Studio 智能感知助手 http gmapvsdoc codeplex com 这可能非常适合 Visual Studio 但 Aptana 基于 Eclipse 使用不同的 Jav
  • 发送密钥不起作用 selenium webdriver python

    我需要将文本发送到描述文本区域 有一些预定义的文本 单击后会被清除 我尝试在 sendkeys 之前使用 clear 或 click 但没有任何效果正常 它将向那里发送文本 但它仍然是灰色的 并且保存页面后出现错误 说明中没有文本 我可以使
  • 在 Java 中使用 String 和 Object 的 equals() 方法

    Object o1 new Object Object o2 new Object o1 o2 System out println o1 equals o2 它返回false 它可以返回true 如果评论被删除 为什么同样的事情不适用于S
  • 是否可以对我的 iPhone 应用程序进行逆向工程?

    我创建了一个 iPhone 应用程序 我想将编译后的 app 文件发送到我的客户端 以便他可以在他的设备上安装和测试这个 iPhone 应用程序 他是否有可能查看这个 app文件的内容 比如这个应用程序中使用的资源文件 图像 声音文件等 他
  • 在 PDF 中使用 Javascript 列出 XFA 对象的属性

    我正在尝试创建一个包含多个文本字段的 PDF 文档 这些文本字段的高度可以增长到某个最大值 由于项目的限制 我使用的是 Adob e Designer 7 它很高兴允许使用 Javascript 然而 XFA 中的对象与 HTML DOM
  • 验证不适用于 EntityManager.merge()

    我对我的实体几乎没有验证 例如 NotNull 还有一些一代人 比如 Id GeneratedValue strategy AUTO Column name ID private Long id Column GeneratedValue
  • 如何通过 CloudFront 将对象放入 S3

    我想通过 CloudFront 将图像上传到 S3 如果你看到关于CloudFront的文档 你可以发现cloud front提供了put方法来上传到cloudFront 可能会有人问我为什么使用云端上传到S3 如果你搜索一下 你就能找到解
  • 运算符和操作数的排列算法

    我在一个面试网站上看到了这个问题 我们有 4 个数字 即 n1 n2 n3 n4 我们可以将它们放置在任何 顺序 我们可以在它们之间使用数学运算符 最终结果为 24 为此编写一个算法 需要 4 个数字并返回 false 或 true 最终结
  • Eclipse 给出错误,最近更新后缺少 R.java 文件

    我已经更新了我的SDK and ADT到最新版本 我也更新了Eclipse to Kepler最新一篇之后Juno My ADT版本是22 0 在此更新之后 当我创建新项目时 出现错误 指出R cannot be resolved to a
  • 编写一个http嗅探器

    我想编写一个程序来通过数据包捕获提取系统访问的网站的 URL IP 地址 我认为该 URL 将出现在数据部分中 即不在任何标头中 ethernet ip tcp udp 此类程序有时称为http嗅探器 我不应该使用任何可用的工具 作为初学者
  • 无法解析 IntelliJ Idea IDE 中的符号 javafx.application

    我尝试创建一个JavaFXIntelliJ Idea IDE 中的应用程序 但我收到编译错误 java 包 javafx application 不存在 我已将项目 SDK 和项目语言级别更改为 Java 8 重新加载项目 但没有帮助 然后
  • 如何给 TriangleMesh 中的一些三角形着色?

    我想用不同的颜色为 TriangleMesh 的一些三角形着色 最简单的方法是什么 甚至可以在 fxml 文件中实现 java代码 import javafx application Application import javafx fx
  • 以最小尺寸分割字符串

    我正在编写一个 python 脚本 它将接受点分隔的版本号 它将把这个字符串分成单独的部分 使用句点 作为分隔符 我的脚本最多支持 4 个组件 例如1 2 3 4 然而 用户可以指定less or more组件数量超过 4 个 我的脚本需要
  • 在 Bootstrap 3 导航栏上使用 NAV 和 DIV 有什么区别?

    在最新的 Bootstrap 3 导航栏的示例中 我在网络上找到了各种示例 其中外部导航栏标记是 div class navbar navbar default navbar static top div 和其他例子正在使用
  • Clang:错误:非静态数据成员的使用无效

    这个 gcc 是否过于友善并且做了开发人员认为它会做的事情 或者 clang 对某些事情过于挑剔 我是否遗漏了标准中的一些微妙规则 其中 clang 对此的抱怨实际上是正确的 或者我应该使用第二位代码 这基本上就是 offsetof 的工作
  • 如何在 Java 中将文件路径列表转换为 Hireachial 树

    有人可以给我一些建议吗 我想要获取文件路径列表 只是字符串 并转换为类似层次树的结构 因此有两个任务 解析字符串以创建树 以及创建树或某种映射结构以实际将结果放入其中 第三个任务是解析树以在 html 中显示为树 我使用的是 Java 7