用for循环构建树

实体类java

    

public class TreeNode {


    private String id;
    private String name;
    private String parentId;
    private List<TreeNode> children;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    public List<TreeNode> getChildren() {
        return children;
    }

    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }

    public TreeNode() {
        super();
    }


}

  核心方法类node

public class TreeMain {
   public static void main(String[] args) {
        List<TreeNode> menuList = new ArrayList<TreeNode>();
          TreeNode t1 = new TreeNode();
           t1.setId("1");
          TreeNode t2 = new TreeNode();
           t2.setId("2");
          TreeNode t3 = new TreeNode();
           t3.setId("3");

          TreeNode t4 = new TreeNode();
           t4.setId("4");
           t4.setParentId("1");

          TreeNode t5 = new TreeNode();
           t5.setId("5");
           t5.setParentId("4");

          TreeNode tt5 = new TreeNode();
           tt5.setId("7");
           tt5.setParentId("4");

          TreeNode t6 = new TreeNode();
           t6.setId("6");
           t6.setParentId("2");

           menuList.add(t1);
           menuList.add(t2);
           menuList.add(t3);
           menuList.add(t4);
           menuList.add(t5);
           menuList.add(t6);
           menuList.add(tt5);
   List<TreeNode> nodeList = TreeMain.list2Tree(menuList);
    for (TreeNode t : nodeList) {
        if (t.getChildren() != null) {
            t.setChildren(null);
        }
    }
    System.out.println("nodeList:" + JSON.toJSONString(nodeList));
   }
  }
   
   //核心诡计
   public static List<TreeNode> list2Tree(List<TreeNode> menuList){
         List<TreeNode> nodeList = new ArrayList<TreeNode>();
          for(TreeNode node1 : menuList){
             boolean addTheNode = true;
             for(TreeNode node2 : menuList){
               if(node1.parent_id != null && node1.parent_id.equals(node2.id)){
                  addTheNode = false;
                  if(node2.getChildren() == null){
                  node2.setChildren(new ArrayList<TreeNode>());
                  }
                  node2.getChildren.add(node1);
               }
             }
             if(addTheNode){
             nodeList.add(node1);
             }
          }   
          return nodeList;
   }
}

  OK ,解释一下楼上的代码,main方法里没啥东西,主要是模拟从数据库中load数据(数据必须包含id和pid),实体很定是本身建的,否则不会有children这个list。数据库

  来看核心诡计,此方法中,把menuList中的数据所有都遍历一遍,而后开始小蝌蚪找妈妈了——咱们只须要把,对应的子节点的实体添加进它父节点的children集合中,这样不论有多少级数据,它们都只会找寻本身的父节点。若是打印出menuList就能够看到所有的数据。最后只须要把没父节点的节点,也就是树的顶层抽出,这棵树就已经构建起来了~。this

相关文章
相关标签/搜索