一、引言
有時候我們從數據庫中讀取出了一個表的數據,比如存儲的是中國的省市縣的ID、名稱與父節點ID,讀出來的數據並不是前台想要的,這個時候我們要想法處理一下都出來的list,將它變為一個樹。
比如直接查出來是圖(1)的數據,我們要的效果是圖(2)的數據
圖(1)
圖(2)
二、使用過程
1、新建TreeNode實體類,對應數據庫中的數據
public class TreeNode{
private String id;//本節點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;
}
}
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);
轉載自:https://blog.csdn.net/xcymorningsun/article/details/79254819