场景
当我们从数据库中查询出数据后,各数据中通过id,pid(父id)关联,我们需要将这些数据改为树型结构。
这个工具类可以完全直接拿过去就用
工具类代码
package com.wenge.common.utils;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName TreeNode 树化操作
**/
public class TreeNode<C extends TreeNode<?>>{
/**
* id
*/
private Integer id;
/**
* 父id
*/
private Integer pid;
/**
* id
*/
private String name;
/**
* 附加属性
*/
private Object data;
/**
* 节点数量统计
*/
private Integer num =0;
private Integer type;
/**
* 子节点集合
* 非数据库字段
*/
private List<TreeNode> children;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public List<TreeNode> getChildren() {
return children;
}
public void setChildren(List<TreeNode> children) {
this.children = children;
}
/**
* @description: 生成树工具(根节点可有多个)
*/
public static <T extends TreeNode>List<T> build(List<T> treeNodes, Integer parentId){
if (parentId == null){
return null;
}
List<T> rootNodes = new ArrayList<>();
for (T t : treeNodes){
if (parentId.equals(t.getPid())){
//得到根节点
rootNodes.add(t);
}
}
for (T t : rootNodes){
t.setChildren(getChildNodes(t,treeNodes));
}
sumCount(rootNodes);
return rootNodes;
}
/**
* 计算数量
* @param treeNodes
* @param <T>
* @return
*/
public static <T extends TreeNode>List<T> sumCount(List<T> treeNodes){
if (treeNodes == null){
return null;
}
getChildNodesNum(treeNodes);
return treeNodes;
}
/**
* @description: 获得子节点
*/
private static <T extends TreeNode>List<TreeNode> getChildNodes(TreeNode t,List<T> treeNodes){
List<TreeNode> childNodes = new ArrayList<>();
for (TreeNode t1 : treeNodes){
if (t1.getPid().equals(t.getId())){
childNodes.add(t1);
}
}
if (childNodes.size() == 0){
return null;
}
for (TreeNode t1 : childNodes){
t1.setChildren(getChildNodes(t1,treeNodes));
}
return childNodes;
}
/**
* @description: 获得子节点
*/
private static <T extends TreeNode> int getChildNodesNum(List<T> treeNodes){
List<TreeNode> childNodes = new ArrayList<>();
int count = 0;
for (TreeNode t1 : treeNodes){
if(null!=t1.getType()){
count+=getChildNodesNum(t1.getChildren());
}else{
count++;
}
t1.setNum(count);
}
return count;
}
public static void main(String[] args) {
List<TreeNode> treeNodeList = new ArrayList<>();
TreeNode treeNode1 = new TreeNode();
treeNode1.setId(1);
treeNode1.setPid(0);
treeNode1.setName("父");
TreeNode treeNode2 = new TreeNode();
treeNodeList.add(treeNode1);
treeNode2.setId(2);
treeNode2.setPid(1);
treeNode2.setName("子");
treeNodeList.add(treeNode2);
List<TreeNode> build = TreeNode.build(treeNodeList, 0);
System.out.println(build);
}
}
测试代码
public static void main(String[] args) {
List<TreeNode> treeNodeList = new ArrayList<>();
TreeNode treeNode1 = new TreeNode();
treeNode1.setId(1);
treeNode1.setPid(0);
treeNode1.setName("父");
TreeNode treeNode2 = new TreeNode();
treeNodeList.add(treeNode1);
treeNode2.setId(2);
treeNode2.setPid(1);
treeNode2.setName("子");
treeNodeList.add(treeNode2);
List<TreeNode> build = TreeNode.build(treeNodeList, 0);
System.out.println(build);
}