Java 树表示路径列表中的文件系统(文件/目录)

2024-01-23

我有一个这样的路径列表

/mnt/sdcard/folder1/a/b/file1
/mnt/sdcard/folder1/a/b/file2
/mnt/sdcard/folder1/a/b/file3
/mnt/sdcard/folder1/a/b/file4
/mnt/sdcard/folder1/a/b/file5
/mnt/sdcard/folder1/e/c/file6
/mnt/sdcard/folder2/d/file7
/mnt/sdcard/folder2/d/file8
/mnt/sdcard/file9

因此,从这个路径列表(Stings)中,我需要创建一个 Java 树结构,其中文件夹作为节点,文件作为叶子(不会有空文件夹作为叶子)。

我认为我需要的是添加方法,我将字符串(文件的路径)传递给它们,并将其添加到树中创建正确节点(文件夹)的正确位置(如果它们尚不存在)

当我位于节点和叶子列表上时,此树结构将需要我获取节点列表(但我认为这将是树的正常功能)

我将始终将字符串作为路径,而不是真正的文件或文件夹。 是否有可以使用的东西或可以启动的源代码?

非常感谢。


感谢您的所有回答。我做了我的工作实施。 我认为我需要改进它,以便在向树结构添加元素时使用更多缓存来使其更好地工作。

正如我所说,我需要的是一种能够让我对 FS 进行“视觉”表示的结构。

MXMTree.java

public class MXMTree {

    MXMNode root;
    MXMNode commonRoot;

    public MXMTree( MXMNode root ) {
        this.root = root;
        commonRoot = null;
    }

    public void addElement( String elementValue ) { 
        String[] list = elementValue.split("/");

        // latest element of the list is the filename.extrension
        root.addElement(root.incrementalPath, list);

    }

    public void printTree() {
        //I move the tree common root to the current common root because I don't mind about initial folder
        //that has only 1 child (and no leaf)
        getCommonRoot();
        commonRoot.printNode(0);
    }

    public MXMNode getCommonRoot() {
        if ( commonRoot != null)
            return commonRoot;
        else {
            MXMNode current = root;
            while ( current.leafs.size() <= 0 ) {
                current = current.childs.get(0);
            }
            commonRoot = current;
            return commonRoot;
        }

    }


}

MXMNode.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class MXMNode {

    List<MXMNode> childs;
    List<MXMNode> leafs;
    String data;
    String incrementalPath;

    public MXMNode( String nodeValue, String incrementalPath ) {
        childs = new ArrayList<MXMNode>();
        leafs = new ArrayList<MXMNode>();
        data = nodeValue;
        this. incrementalPath = incrementalPath;
    }

    public boolean isLeaf() {
        return childs.isEmpty() && leafs.isEmpty();
    }

    public void addElement(String currentPath, String[] list) {

        //Avoid first element that can be an empty string if you split a string that has a starting slash as /sd/card/
        while( list[0] == null || list[0].equals("") )
            list = Arrays.copyOfRange(list, 1, list.length);

        MXMNode currentChild = new MXMNode(list[0], currentPath+"/"+list[0]);
        if ( list.length == 1 ) {
            leafs.add( currentChild );
            return;
        } else {
            int index = childs.indexOf( currentChild );
            if ( index == -1 ) {
                childs.add( currentChild );
                currentChild.addElement(currentChild.incrementalPath, Arrays.copyOfRange(list, 1, list.length));
            } else {
                MXMNode nextChild = childs.get(index);
                nextChild.addElement(currentChild.incrementalPath, Arrays.copyOfRange(list, 1, list.length));
            }
        }
    }

    @Override
    public boolean equals(Object obj) {
        MXMNode cmpObj = (MXMNode)obj;
        return incrementalPath.equals( cmpObj.incrementalPath ) && data.equals( cmpObj.data );
    }

    public void printNode( int increment ) {
        for (int i = 0; i < increment; i++) {
            System.out.print(" ");
        }
        System.out.println(incrementalPath + (isLeaf() ? " -> " + data : "")  );
        for( MXMNode n: childs)
            n.printNode(increment+2);
        for( MXMNode n: leafs)
            n.printNode(increment+2);
    }

    @Override
    public String toString() {
        return data;
    }


}

Test.java 用于测试代码

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String slist[] = new String[] { 
                "/mnt/sdcard/folder1/a/b/file1.file", 
                "/mnt/sdcard/folder1/a/b/file2.file", 
                "/mnt/sdcard/folder1/a/b/file3.file", 
                "/mnt/sdcard/folder1/a/b/file4.file",
                "/mnt/sdcard/folder1/a/b/file5.file", 
                "/mnt/sdcard/folder1/e/c/file6.file", 
                "/mnt/sdcard/folder2/d/file7.file", 
                "/mnt/sdcard/folder2/d/file8.file", 
                "/mnt/sdcard/file9.file" 
        };

        MXMTree tree = new MXMTree(new MXMNode("root", "root"));
        for (String data : slist) {
            tree.addElement(data);
        }

        tree.printTree();
    }

}

如果您对改进有什么好的建议,请告诉我:)

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

Java 树表示路径列表中的文件系统(文件/目录) 的相关文章

随机推荐

  • Matlab 中的动态结构生成

    我有一个字段名称列表 想要生成一个嵌套结构 我试过这个 fn1 a b c fn2 d e f s struct for n1 fn1 for n2 fn2 s n1 n2 0 end end 但 Matlab 抱怨符号 fieldname
  • 在所有数据库的所有对象中查找表名

    我有一个包含多个数据库和客户端应用程序的系统 所有数据库都位于一个 SQL Server 实例中 它们是由不同的人在不同的时间开发的 因此 如果发生某些错误 则很难找到数据在哪个过程或触发器中被修改 现在我使用这个脚本 我在这个网站上找到了
  • 如何将ggplot图标题居中

    在 ggplot 中居中对齐绘图标题的 lege artis 方式 绘图标题 element text hjust 0 5 https stackoverflow com questions 40675778 center plot tit
  • 谷歌人工智能平台与机器学习引擎

    我做了很多搜索 但我不明白它们之间有什么区别google ai platform and ml engine 看起来它们都可以用于训练和部署模型 其他诸如 google cloud automl google ai hub 之类的词也很令人
  • 如何获取R中当前的工作目录?

    如何获取当前工作目录 我想应该有一个像 getcwd 这样的命令 但是 我在文档中找不到类似的命令 如何更改到另一个目录 启动R时如何设置默认工作目录 版本 平台 x86 64 w64 mingw32拱门x86 64操作系统 mingw32
  • 为什么我的代码只使用字符串替换方法替换某些字符?

    对于我的作业 我必须编写代码来编码 解码消息 当我开始发现每当我键入消息时 程序仅替换某些字符时 我已接近尾声 翻译相当简单 要编码 您将 a 更改为字母表中相反的字母 即 z b 到 y c 到 x d 到 w 等 作业如下 该项目涉及编
  • 在 jetpack compose 中使用 LaunchedEffect 与 SideEffect

    大家好 我正在学习项目中的副作用 我想知道我什么时候应该使用LaunchedEffect and SideEffect在什么场景下 我正在添加一些使用这两种效果的代码 如果我在这里做错了 请让我知道 第一次使用 LaunchedEffect
  • Collections.synchronizedlist() 在从末尾迭代时删除元素[重复]

    这个问题在这里已经有答案了 我在用Collections Synchronizedlist 使我的arraylist线程安全 我想问的是以下代码是线程安全的 即在从末尾迭代列表时删除 pendingExecutionList Collect
  • 从 Google Chrome 扩展程序中的通知切换当前选项卡

    我在 Chrome 中遗漏了什么吗选项卡文档 http code google com chrome extensions tabs html或者有没有办法让扩展程序更改当前活动的选项卡 我有一个扩展 一旦选项卡完成加载 就会弹出一个通知
  • 在 BreezeJS 客户端中解析元数据时出现异常

    前传和版本信息 BreezeJS客户端版本 1 5 2 通过设计时 EntityFramework 模型在自定义服务器上生成的元数据 6 1 2 BreezeLabs EdmBuilder 1 0 5 生成元数据时也遇到问题 可以在此处阅读
  • 更改O365邮件服务器后SSRS报告订阅错误

    我们有一个订阅服务 它会向每位顾问发送一封邮件 说明他们未来几周的计划 两周前 我们已从本地邮件服务器更改为 O365 邮件服务器 自从这一变化以来 我注意到一些顾问没有收到他们应该收到的邮件 这让我查看了 RS 日志 两周前我有 6 个人
  • 如何在桌面上的文件夹中创建文本文件

    我的项目有问题 我的桌面上有一个项目文件夹 我想创建一个文本文件并写入包含该文本文件的内容 这是我的代码 ofstream example Users sample Desktop save txt 但我希望它可以在另一台Mac上运行 我不
  • Android:使图库无限循环图像

    我在我的项目中使用一个画廊 其中添加了四个图像 并且我希望它从右侧和左侧都是无限的 我该如何实现这个目标 主要思想是在你的getView方法 你必须使用 position position imagesArray length if pos
  • org.javafxports 有什么区别 » jfxmobile-plugin 1.3.16 和 2.0.30

    org javafxports jfxmobile plugin 1 3 16 和 2 0 30 有什么区别 我尝试将版本 1 3 16 更新到 2 0 30 但无法编译项目 jfxmobile plugin 是一个 gradle 插件 它
  • 如何在Oracle sqlplus中编写for循环?

    我正在尝试在 Oracle sqlplus 接口中编写一个 for 循环 当编写循环语句并按 Enter 键时 出现错误 SQL gt for i in 1 10 loop SP2 0734 unknown command beginnin
  • OmniAuth Facebook 令牌过期错误

    我正在使用 OmniAuth 在我的应用程序中访问 Facebook 我正在使用 fb graph gem https github com nov fb graph https github com nov fb graph发布到 Fac
  • 使用 Imagemagick - PHP 计算 PDF 文件中的页数

    我在用PHP 5 与 Apache in my Windows Vista 电脑 我有Imagemagick已经安装并配置 我想使用以下方法计算 pdf 文件中的总页数imagick 我找到了一个解决方案here https stackov
  • 需要用百分比符号Java替换字符串内的空格

    我需要用 符号替换字符串内的空格 但我遇到了一些问题 我尝试的是 imageUrl imageUrl replace 20 但它在替换功能中给了我一个错误 Then imageUrl imageUrl replace 20 但它仍然在替换功
  • OpenGL 影子彼得潘

    我通过执行两个绘制通道 一个到深度图 一个到普通帧缓冲区 向 OpenGL 中的场景添加阴影 使用深度图时不使用偏置 会出现很多阴影痘痘 这是通过在深度图检查中添加偏差来解决的 然而 当光线移动到不同的角度时 这会导致阴影与物体 分离 我相
  • Java 树表示路径列表中的文件系统(文件/目录)

    我有一个这样的路径列表 mnt sdcard folder1 a b file1 mnt sdcard folder1 a b file2 mnt sdcard folder1 a b file3 mnt sdcard folder1 a