树状结构

时间:2009-08-04 07:21:24

标签: java

我有以下课程:

public  class Model {
    protected String name;
    protected ArrayList<Model> children;

    public Model(){
        children = new ArrayList<Model>();
    }

    public void addChild(Model node) {
        children.add(node);       
    }
    //other code here
}


public class cPackage extends Model{
    public cPackage() {
        super();
    }

    //other code here
}


public class cClass extends Model{
    public cClass() {
        super();
    }
    //other code here
}

public class cMethod extends Model{
    public cMethod() {
        super();
    }
    //other code here
}

public void tryme(Object[] objs){
    String values = (String)objs[0];
    Model root = null;

    astNode = ax.getDeclaringNodeInProject(handles, bindings);

    if(astNode instanceof TypeDeclaration){
        TypeDeclaration  cl = (TypeDeclaration)astNode;
        root = new cClass();
        root.setName(cl.getName().getFullyQualifiedName());
    }else if(astNode instanceof MethodDeclaration){
        MethodDeclaration me = (MethodDeclaration)astNode;
        root = new cMethod();
        List mod =  me.parameters();
        String vars ="";
        ...
        root.setName(me.getName().getFullyQualifiedName() + "(" + vars + ")");
    }

    Model currentNode = null;
    Model prevNode = root;

    for(int i = 1 ; i < objs.length; i++){
        if(astNode instanceof PackageDeclaration){
            PackageDeclaration pka = (PackageDeclaration)astNode;
            p8.setName(pka.getFullyQualifiedName());
            if(currentNode == null) {
                currentNode = p8;
                prevNode.addChild(currentNode);
            }
            prevNode = currentNode;
        }else if(astNode instanceof MethodDeclaration){
            MethodDeclaration me = (MethodDeclaration)astNode;
            ...
            m8.setName(me.getName().getFullyQualifiedName() + "(" + vars + ")");

            if(currentNode == null) {
                currentNode = m8;
                prevNode.addChild(currentNode);
            }
            prevNode = currentNode;
        }else if(astNode instanceof TypeDeclaration){
            TypeDeclaration  cl = (TypeDeclaration)astNode;
            c8.setName(cl.getName().getFullyQualifiedName());
            if(currentNode == null) {
                currentNode = c8;
                prevNode.addChild(currentNode);
            }
            prevNode = currentNode;
        }
    }
}

很抱歉,如果缺少“{”或“}”。我在这里尝试做的是我从服务器获得这样的数据:

[School Chair  Table Chalk]

...

[Apple Peer Mango Melon]

全部在数组中。我想建立类似树状结构的东西,从左边读取:

每个元素都是其后面元素的de parent。我正在遍历数据来完成它。例如,我希望得到类似的东西:

+School
      Chair
          Table
              Chalk


+Apple
     Peer
         Mango
             Melon

但是当我运行上面的代码时,我只得到前两个元素,如:

+School
      Chair



+Apple
     Peer

并且不会显示以下元素。

有人可以帮助我在哪里做错了。

感谢。

3 个答案:

答案 0 :(得分:1)

看起来addChild()仅在currentNode为空时被调用,currentNode仅在第一次循环时为空。因此,只有一个孩子被添加。

答案 1 :(得分:0)

在第一次处理各种数据结构时,我完全记得学习曲线。 (指针炖任何人?)

我发现一种非常有用的技术是绘制正在发生的事情的图表。

 { name = "granddad",  children = --- }
                              |
  [  { name = "son1" , children = --- }  { name = "dottir1", children = --- } ... }
                                         |                                     |
                                 [ { ... } ... ]                 [ { ... }, { ...} ... ]

然后,当您用手指检查代码中的实际轨迹时,您将在图中。

答案 2 :(得分:-1)

在循环中,您目前正在执行此操作:

  1. 当前节点=列表中的下一个对象
  2. 将当前节点添加到上一个节点
  3. 将上一个节点设置为当前节点
  4. 循环
  5. 您最终得到的是链接列表。根将只在子列表中有一个子项。那个孩子的孩子名单中会有一个孩子,依此类推。要打印它,您必须遍历链表中的每个节点。