一、引言
有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的(当然现在好多tree库可以使用,不要拆台,最起码不好看是吧==),这个时候我们要想法处理一下都出来的list,将它变为一个树。
比如直接查出来是左边的数据,我们要的效果是右边的数据
二、使用过程
1、新建TreeNode实体类,对应数据库中的数据
public class TreeNode{
private String id;//本节点id
private String name;//本节点名称
private String parentId;//本节点的父节点
private Integer order;//本节点排序,可忽略
private Integer level;//本节点层级
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 Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
}
2、新建TreeUtil类处理list(分别使用两层遍历与递归的方法实现)
public class TreeUtil {
/**
* 两层循环实现建树
* @param treeNodes 传入的树节点列表
* @return
*/
public static List<TreeNode> bulid(List<TreeNode> treeNodes) {
List<TreeNode> trees = new ArrayList<TreeNode>();
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>());
}
treeNode.getChildren().add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
* @param treeNodes
* @return
*/
public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) {
List<TreeNode> trees = new ArrayList<TreeNode>();
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<TreeNode> treeNodes) {
treeNode.setChildren(new ArrayList<TreeNode>());
for (TreeNode it : treeNodes) {
if(treeNode.getId().equals(it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<TreeNode>());
}
treeNode.getChildren().add(findChildren(it,treeNodes));
}
}
return treeNode;
}
}
3、将数据库中的数据保存到list数组中,调用TreeUtil中的处理函数
调用递归方法
TreeUtil.buildByRecursive(menuList);
调用两层遍历的方法
TreeUtil.bulid(menuList);
三、总结
- 本篇博文使用场景;
- 两层遍历与递归方法处理list为tree;
- 使用步骤;