我有这样的路径列表
/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(); } }
如果您有关于即兴创作的好建议,请告诉我:)