首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >开发树形结构

开发树形结构
EN

Stack Overflow用户
提问于 2012-10-25 21:06:40
回答 1查看 201关注 0票数 0

请来人帮帮忙!!我是爪哇新手。我想从一个数组列表中创建一个树形结构。我的输入是

代码语言:javascript
运行
复制
1.1
1.2
1.3
1.3.1.1
1.3.1.2
1.4
1.4.1.1
1.4.2.1

我的目标是得到一个像这样的树

代码语言:javascript
运行
复制
               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’是空的,但我不知道如何第一次设置孩子。请帮帮我。:(

代码语言:javascript
运行
复制
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;
}
}

和Node类

代码语言:javascript
运行
复制
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;
}
}

而Test类是

代码语言:javascript
运行
复制
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;
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-25 21:09:16

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

代码语言:javascript
运行
复制
children = new ArrayList<Node>();

这将实例化您的List children

代码语言:javascript
运行
复制
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构造函数从:

代码语言:javascript
运行
复制
public Tree(String rootData)
{
    root=new Node();
    root.data=rootData;
    root.children=new ArrayList<Node>();
}

public Tree() {
    super();
}

下面的示例,它将使用参数化构造函数实例化Node

代码语言:javascript
运行
复制
public Tree(String rootData) {
    root=new Node(rootData);
}

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

P.S:-

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13069290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档