1、TreeData:供实体类继承
import java.util.ArrayList;
import java.util.List;
public class TreeData<T,E> {
public E id;
public E pid;
public List<T> child=new ArrayList<>();
}
2、TreeUtil:实现工具类
import java.util.*;
/**
* @author YZX
*/
/***
*
* @param <T> 数据类 类型
* @param <E> id pid数据类型
*/
public class TreeUtil<T extends TreeData<T, E>, E> {
private List<T> treeData;
private Map<E, List<T>> map;
private String rootStringValue;
/***
*
* @param data 数据源
* @param rootStringValue 指定根节点标识,例如系统中pid为“0”的是根节点
*/
public TreeUtil(List<T> data,String rootStringValue) {
this.treeData = data;
this.map = new HashMap<>(data.size());
this.rootStringValue = rootStringValue;
for (T datum : data) {
List<T> ts = this.map.get(datum.pid);
if (null == ts) {
ts = new ArrayList<T>();
map.put(datum.pid, ts);
}
ts.add(datum);
}
}
public TreeUtil() {
}
/***
* 构建树
* @return
*/
public List<T> getTreeList() {
List<T> resultData = new ArrayList<>();
Map<E, List<T>> map = this.map;
List<T> treeData = this.treeData;
for (T treeDatum : treeData) {
E id = treeDatum.id;
List<T> ts = map.get(id);
if (null != ts) {
treeDatum.child = ts;
}
if (rootStringValue.equals(String.valueOf(treeDatum.pid))) {
resultData.add(treeDatum);
}
}
return resultData;
}
}
构建对象:
public class Dept extends TreeData<Dept,Integer> {
public String name;
public Dept(int id, String name, int pid) {
super.id = id;
this.name = name;
super.pid = pid;
}
public Dept() {
}
@Override
public String toString() {
return "Dept{" +
"id=" + id +
", name='" + name + '\'' +
", pid=" + pid +
", child=" + child +
'}';
}
}
测试案例
Dept 技术部 = new Dept(2, "技术部", 1);
Dept 市场部 = new Dept(3, "市场部", 1);
Dept 产品部 = new Dept(4, "产品部", 1);
Dept 开发部 = new Dept(5, "开发部", 2);
Dept 运维部 = new Dept(6, "运维部", 2);
Dept 投标部 = new Dept(7, "投标部", 3);
Dept 招标部 = new Dept(8, "招标部", 3);
Dept 前端部门 = new Dept(9, "前端部门", 5);
Dept 后端部门 = new Dept(10, "后端部门", 5);
Dept zzz = new Dept(11, "zzz", 9);
Dept xxx = new Dept(12, "xxx", 11);
List<Dept> a=new ArrayList<>();
a.add(技术部);
a.add(市场部);
a.add(产品部);
a.add(开发部);
a.add(运维部);
a.add(投标部);
a.add(招标部);
a.add(前端部门);
a.add(后端部门);
a.add(zzz);
a.add(xxx);
TreeUtil<Dept,Integer> treeUtil = new TreeUtil(a,"1");
List<Dept> treeList = treeUtil.getTreeList();
treeList.forEach(System.out::println);