0

Please someone help!!i m a newbie in Java. i want to make a tree structure from an Array List. My input is

1.1
1.2
1.3
1.3.1.1
1.3.1.2
1.4
1.4.1.1
1.4.2.1

and my aim is to get a Tree like

               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

and so on.

Please find below my classes for the same. I get a nullPoniter at test.tree.Node.addChild(Node.java:28) and I know it is because the 'children' is null but I dont know how to set the children for the first time. Please Help... :(

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

and Node class

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

and the Test class is

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 に答える