当前位置: 首页 > 面试题库 >

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

云利
2023-03-14
问题内容

我有这样的路径列表

/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 Tree结构,该结构以文件夹作为节点,文件作为叶(不会有空文件夹作为叶)。

我需要的是add方法,我将一个String(文件的路径)传递给他们,然后将其添加到树中的正确位置,以创建正确的节点(文件夹)(如果尚未存在)

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

我将始终将字符串作为路径,而不是真实的文件或文件夹。是否准备好使用某些东西或启动源代码?

非常感谢你。


问题答案:

谢谢您的回答。我做了我的工作实施。我认为我将需要对其进行改进,以使其在向树结构添加元素时具有更多缓存,从而更好地工作。

正如我所说的,我需要的是一种结构,可以让我对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();
    }

}

如果您有关于即兴创作的好建议,请告诉我:)



 类似资料:
  • 所以我必须使用Java文件树系统,因为。由于某些原因,listfiles文件在通过远程网络时速度非常慢。但是,所有Java文件树系统示例都列出了子目录中的所有文件,这严重降低了程序的速度。如何使它只搜索目录,并返回该目录中的文件夹和文件名,而不返回子目录。 示例代码: 如有任何见解或帮助,将不胜感激,谢谢。

  • 我有一个带有子目录的目录,其中包含各种大小的文件。我想复制一个特定的文件,并立即用所有文件替换它。 例如我有:C:\Folder\Sub_Folder\file1.extC:\Folder\Sub_Folder\file2.ext 我想制作“random_file.ext”的副本,然后将所有副本替换为上面提到的具有原始名称的文件file1.extfile2.ext这样random_file.ext

  • 问题内容: 我需要从给定目录获取文件及其父目录的路径,但不包括它。 因此,例如,如果给我的方法指定path:作为路径,它将返回该目录及其下所有文件的路径。 因此,如果有子文件夹:,并且每个包含,则该方法的结果将是2个字符串,其中包含和 并且如果在其中有一个目录,该目录中有,则为该文件创建的字符串将为,并且如果还有其他子目录可以继续。 我的想法是我只想要文件上方的目录路径,而不是绝对路径,因此只希望

  • 问题内容: 我一直在努力解决这个问题,所以也许有些人可以帮助我。我有一个带有完整路径的文件列表(这些只是文件 在另一台机器上的字符串),例如: 我想创建一个Jtree来显示目录结构,如下所示: I’ve been spliting the string on the seperator so I end up with a list of arrays like: 现在,我想一次为它们添加一个索引

  • 问题内容: 在这个话题上有很多困惑。已经提出了几个问题。事情似乎仍然不清楚。ClassLoader,绝对文件路径等 假设我有一个项目目录结构, 我在“ lib / txt”目录中有一个资源说“ txtfile.txt”。我想以系统独立的方式访问它。我需要项目的绝对路径。所以我可以将路径编码为abspath +“ / lib / Dictionary / txtfile.txt” 假设我这样做 我得

  • 我的代码: 我已经试过了,而不是。getFile(),extractJarFileFromURL或资源。getInputStream(),但所有这些都不起作用。当我打包项目并将其作为jar文件运行时,它试图打开以下文件,它总是返回以下消息。 错误: java.io.FileNotFoundException:类路径资源[资产/OPTIONS_DE. docx]无法解析为绝对文件路径,因为它不驻留在