實體類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