从文件路径构建树,我的逻辑是否正确?

时间:2013-05-15 08:43:02

标签: java data-structures tree tree-traversal

我正在尝试构建一个树,我想基于像下面那样的文件路径将父节点链接到子节点,其中世界是根:

    The World
    The World/Asia
    The World/Asia/Afghanistan
    The World/Asia/Iran
    The World/Asia/China";

我想把它变成这样: enter image description here

我采取的方法如下。我想知道是否有人能帮助我指出正确的方向。我不确定我的逻辑是否正确?

 public void linkNodeToParent(String path, Node n)
{
    String[] pathNodes = path.split("/");
    Node parent = root;
    for(int i = 0; i < pathNodes.length; ++i)
    {
       for(int j = 0; j < parent.getChildren().size(); ++j)
       {
           if(parent.getChildren().get(j).getNodeName().equals(pathNodes[i]))
               parent = parent.getChildren().get(j);
       }
    }

}

3 个答案:

答案 0 :(得分:6)

希望以下代码可以帮助您使用Tree

创建文件夹结构
import java.util.*;
class Tree
{
    class Node
    {
        String data;
        ArrayList<Node> children;

        public Node(String data)
        {
            this.data = data;
            children = new ArrayList<Node>();
        }

        public Node getChild(String data)
        {
            for(Node n : children)
                if(n.data.equals(data))
                    return n;

            return null;
        }
    }

    private Node root;

    public Tree()
    {
        root = new Node("");
    }

    public boolean isEmpty()
    {
        return root==null;
    }

    public void add(String str)
    {
        Node current = root;
        StringTokenizer s = new StringTokenizer(str, "/");
        while(s.hasMoreElements())
        {
            str = (String)s.nextElement();
            Node child = current.getChild(str);
            if(child==null)
            {
                current.children.add(new Node(str));
                child = current.getChild(str);
            }
            current = child;
        }
    }

    public void print()
    {
        print(this.root);
    }

    private void print(Node n)
    {
        if(n==null)
            return;
        for(Node c : n.children)
        {
            System.out.print(c.data + " ");
            print(c);
        }
    }

    public static void main(String[] args)
    {
        Tree t = new Tree();
        t.add("The World");
        t.add("The World/Asia");
        t.add("The World/Asia/Afghanistan");
        t.add("The World/Asia/Iran");
        t.add("The World/Asia/China");    // Even if you insert only this statement.
                                          // You get the desired output, 
                                          // As any string not found is inserted

        t.print();
    }
}
  1. “add”方法将文件夹或整个路径作为输入,并根据需要将其存储在树中。它接受第一个字符串并检查它是否已经存在于树中,否则它会添加它并继续下一个字符串(您的术语中的文件夹)。
  2. print方法可帮助您验证树中数据的存储。

答案 1 :(得分:0)

考虑使用新的NIO.2 API。

每个节点都可以包含一个Path对象。

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html

答案 2 :(得分:0)

如果你在每一端添加一个反对“/”,正如我们在聊天中谈到的那样,那么这个程序将会起作用

void split()
    {
        String path=
                "The World/"+
                "The World/Asia/"+
                "The World/Asia/Afghanistan/"+
                "The World/Asia/Iran/"+
                "The World/Asia/China/";
        String[] pathNodes = path.split("/");

//      for(String s:pathNodes)
//      {
//          System.out.println(s);
//      }

        String root="The World";
        String continent="Asia";
        List<String> ls=new ArrayList<String>();

        for(int i=0;i<pathNodes.length;i++)
        {
            if(pathNodes[i].equals(root))
            {
                if(pathNodes[i+1].equals(continent))
                {
                    ls.add(pathNodes[i+2]);
                }
            }
        }
        for(String s:ls)
        {
            System.out.println(s);
        }
    }