0

请有人帮助!我是 Java 中的新手。我想从数组列表中创建一个树结构。我的输入是

1.1
1.2
1.3
1.3.1.1
1.3.1.2
1.4
1.4.1.1
1.4.2.1

我的目标是得到一棵树

               1.1
               1.2
               1.3
       1.4           1.3.1.1
 1.4.1.1   1.5          1.3.1.2    
 1.4.1.2

等等。

请在我的课程下面找到相同的内容。我在 test.tree.Node.addChild(Node.java:28) 得到一个 nullPoniter,我知道这是因为“孩子”为空,但我不知道如何第一次设置孩子。请帮忙... :(

public class Tree {
private Node root;

public Tree(String rootData)
{
    root=new Node();
    root.data=rootData;
    root.children=new ArrayList<Node>();
}
public Tree() {
    super();
}
 public Node getRoot(){
    return this.root;
    }
 public void setRoot(Node rootElement) {
    this.root = rootElement;
}
}

和节点类

class Node { 
String data;
Node parent;
List<Node> children;

public Node() {
    super();
}
public Node(String name)
{
    super();
    this.data=name;
}
public void addChild(String name) {
    this.addChild(new Node(name));
}
public void addChild(Node child) {
    this.children.add(child);
}
public void removeChild(Node child) {
    this.children.remove(child);
}
public void removeChild(String name) {
    this.removeChild(this.getChild(name));
}
public Node getChild(int childIndex) {
    return this.children.get(childIndex);
}
public Node getChild(String childName) {
    for (Node child : this.children) {
        if (child.data.equals(childName)) { return child; }
    }
    return null;
}
public List<Node> getChildren() {
    if (this.children == null) {
        return new ArrayList<Node>();
    }
    return this.children;
}
 public void setChildren(List<Node> children) {
    this.children = children;
}
public Node getParentNode() {
    return this.parent;
}
}

测试类是

public class TreeTest {
public static void main(String[] args) {
    TreeTest tt = new TreeTest();
    ArrayList<String> newArr= new ArrayList<String>();
    newArr.add("1.1");
    newArr.add("1.2");
    newArr.add("1.3");
    newArr.add("1.3.1.1");
    newArr.add("1.3.1.2");
    newArr.add("1.4");
    newArr.add("1.4.1.1");
    newArr.add("1.4.2.1");
    int lCount=0;
    int maxCount= newArr.size();
    Tree tr= new Tree();
    Node rootNode = new Node();
    String parent_name=null;
    Node currentNode= new Node();
    for(String line: newArr){
        if(lCount==0){
        rootNode = tt.getTree(line);
        tr.setRoot(rootNode);
        currentNode= rootNode;
        }
        else{
            List<Integer> cur =  new ArrayList<Integer>();
            List<Integer> pre =  new ArrayList<Integer>();
            cur= tokenize(line);
            pre= tokenize(newArr.get(lCount-1));
            if(cur.size()==pre.size()){

                currentNode.addChild(tt.getTree(line));
                currentNode= tt.getTree(line);
                }
            else if (cur.size()>pre.size()){
                currentNode.addChild(tt.getTree(line));
                parent_name= newArr.get(lCount-1);
                currentNode= tt.getTree(line);
                }
            else if(cur.size()< pre.size()){
                currentNode= tt.getTree(parent_name);
                currentNode.addChild(tt.getTree(line));
                currentNode= tt.getTree(line);
            }
        }

        lCount++;
        }
        }
private Node getTree(String string) {
    // TODO Auto-generated method stub
        Node rootNode = new Node(string);
        return rootNode;
    }
private static List<Integer> tokenize(String line) {
    // TODO Auto-generated method stub
    List<Integer> line_Arr =  new ArrayList<Integer>();

    String[] tokens = line.split("\\.");
    int i=0;
    for(String atr: tokens)
        line_Arr.add(Integer.parseInt(atr));

    return line_Arr;
}

}

4

1 回答 1

1

Node类的两个构造函数中,在调用之后添加以下语句super:-

children = new ArrayList<Node>();

这将实例化您的List children.

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

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

此外,您可以从以下位置更改您的1-arg and 0-arg Tree构造函数: -

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

public Tree() {
    super();
}

到下面的一个,它将Node使用参数化构造函数实例化: -

public Tree(String rootData) {
    root=new Node(rootData);
}

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

PS: -

super()如果您只想调用超类0-arg构造函数,则不需要显式添加调用。编译器默认添加此调用。

于 2012-10-25T13:09:15.733 回答