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