将查询到的部门列表数据,进行父子节点树形结构排序
该功能适用需要树形结构的,不仅仅是部门树
步骤:
- 查询数据库,获得所有的部门列表
- 调用下面的实现方法
CREATE TABLE `dept` ( `deptId` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(32) DEFAULT NULL COMMENT '部门名称', `parentId` bigint(20) DEFAULT NULL COMMENT '父级部门ID', PRIMARY KEY (`deptId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8二、Java实体类
package com.changge.pojo;
import java.util.ArrayList;
import java.util.List;
public class Dept {
private String deptId;
private String name;
private String parentId;
private List children = new ArrayList<>();
// get,set等方法省略
...
三、实现方法代码
public List buildDeptTree(List depts) {
List deptList = new ArrayList<>();
List deptIdList = new ArrayList<>();
for (Dept dept : depts) {
deptIdList.add(dept.getDeptId());
}
for (Dept dept : depts) {
// 如果是顶级节点,遍历该父节点所有子节点
if (!deptIdList.contains(dept.getParentId())) {
recursionFn(depts, dept);
deptList.add(dept);
}
}
if (deptList.isEmpty()) {
deptList = depts;
}
return deptList;
}
private void recursionFn(List list, Dept dept) {
// 得到子节点列表
List childList = getChildList(list, dept);
dept.setChildren(childList);
for (Dept tChild : childList) {
// 如果子节点有下一级节点,得到下一级的节点列表
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
private List getChildList(List list, Dept dept) {
List deptList = new ArrayList<>();
for(Dept d:list){
// 遍历非顶级节点,并获得传入参数顶级节点的下一级子节点列表
if (d.getParentId() != null && d.getParentId().equals(dept.getDeptId())) {
deptList.add(d);
}
}
return deptList;
}
private boolean hasChild(List list, Dept dept) {
return getChildList(list, dept).size() > 0;
}



