实体类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