一、引言
有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的,这个时候我们要想法处理一下都出来的list,将它变为一个树。
比如直接查出来是图(1)的数据,我们要的效果是图(2)的数据
图(1) 图(2)二、使用过程
1、新建TreeNode实体类,对应数据库中的数据
public class TreeNode{ private String id;//本节点id private String name;//本节点名称 private String parentId;//本节点的父节点 private Listchildren; 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 getChildren() { return children; } public void setChildren(List children) { this.children = children; }}
2、新建TreeUtil类处理list(分别使用两层遍历与递归的方法实现)
public class TreeUtil { /** * 两层循环实现建树 * @param treeNodes 传入的树节点列表 * @return */ public static Listbulid(List treeNodes) { List trees = new ArrayList (); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(treeNode); } for (TreeNode it : treeNodes) { if (it.getParentId().equals(treeNode.getId()) ) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList ()); } treeNode.getChildren().add(it); } } } return trees; } /** * 使用递归方法建树 * @param treeNodes * @return */ public static List buildByRecursive(List treeNodes) { List trees = new ArrayList (); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(findChildren(treeNode,treeNodes)); } } return trees; } /** * 递归查找子节点 * @param treeNodes * @return */ public static TreeNode findChildren(TreeNode treeNode,List treeNodes) { treeNode.setChildren(new ArrayList ()); for (TreeNode it : treeNodes) { if(treeNode.getId().equals(it.getParentId())) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList ()); } treeNode.getChildren().add(findChildren(it,treeNodes)); } } return treeNode; } }
3、将数据库中的数据保存到list数组中,调用TreeUtil中的处理函数
调用递归方法
TreeUtil.buildByRecursive(menuList);
调用两层遍历的方法
TreeUtil.bulid(menuList);
转载自: