4

我正在尝试构建一棵树,并且我想基于类似文件路径的结构将父节点链接到子节点,例如下面的结构,其中 The World 是根:

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

我想把它变成这样: 在此处输入图像描述

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

 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);
       }
    }

}
4

3 回答 3

8

希望下面的代码可以帮助您使用 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. “添加”方法将文件夹或整个路径作为输入,并根据需要将其存储在树中。它采用第一个字符串并检查它是否已经存在于树中,否则它会添加它并继续到下一个字符串(您的术语中的文件夹)。
  2. print 方法帮助您验证数据在树中的存储。
于 2013-05-15T10:11:12.763 回答
0

考虑使用新的 NIO.2 API。

每个 Node 都可以持有一个 Path 对象。

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

于 2013-05-15T08:50:32.140 回答
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);
        }
    }
于 2013-05-15T10:10:02.950 回答