将查询到的部门列表数据,进行父子节点树形结构排序
该功能适用需要树形结构的,不仅仅是部门树
步骤:
- 查询数据库,获得所有的部门列表
- 调用下面的实现方法
一、建表语句
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
数据例如:
二、实现方法代码:
import com.alibaba.fastjson2.JSON;
import java.util.ArrayList;
import java.util.List;
public class demo {
/**
* 部门实体
*
*/
public static class Dept {
/**
* 部门id
*/
private String deptId;
/**
* 部门名称
*/
private String name;
/**
* 父部门id
*/
private String parentId;
/**
* 子部门
*/
private List<Dept> children = new ArrayList<>();
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
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<Dept> getChildren() {
return children;
}
public void setChildren(List<Dept> children) {
this.children = children;
}
}
public static void main(String[] arg) {
List<Dept> deptList = new ArrayList<>();
//添加第一级
Dept dept = new Dept();
dept.setDeptId("1000");
dept.setParentId("0");
dept.setName("康复中心门诊");
deptList.add(dept);
Dept dept1 = new Dept();
dept1.setDeptId("1001");
dept1.setParentId("0");
dept1.setName("妇产科");
deptList.add(dept1);
Dept dept2 = new Dept();
dept2.setDeptId("1002");
dept2.setParentId("0");
dept2.setName("骨伤科");
deptList.add(dept2);
//添加第二级
Dept dept3 = new Dept();
dept3.setDeptId("10021");
dept3.setParentId("1002");
dept3.setName("颈肩腰腿痛专科门诊");
deptList.add(dept3);
Dept dept4 = new Dept();
dept4.setDeptId("10022");
dept4.setParentId("1002");
dept4.setName("骨伤二科(康复六科)门诊");
deptList.add(dept4);
Dept dept5 = new Dept();
dept5.setDeptId("10001");
dept5.setParentId("1000");
dept5.setName("肌骨疼痛康复门诊");
deptList.add(dept5);
Dept dept6 = new Dept();
dept6.setDeptId("10002");
dept6.setParentId("1000");
dept6.setName("脑卒中康复门诊");
deptList.add(dept6);
//添加第三级
Dept dept7 = new Dept();
dept7.setDeptId("100021");
dept7.setParentId("10002");
dept7.setName("脑卒中康复门诊-小门诊");
deptList.add(dept7);
Dept dept8 = new Dept();
dept8.setDeptId("100022");
dept8.setParentId("10002");
dept8.setName("脑卒中康复门诊-小门诊-小小门诊");
deptList.add(dept8);
List<Dept> deptListNew = buildDeptTree(deptList);
System.out.println(deptListNew.size());
for (Dept dept9 : deptListNew) {
System.out.println("一级信息:" + JSON.toJSONString(dept9));
if (hasChild(dept9.getChildren(), dept9)) {
for (Dept dept10 : dept9.getChildren()) {
//System.out.println("二级信息:" + JSON.toJSONString(dept10));
if (hasChild(dept10.getChildren(), dept10)) {
for (Dept dept11 : dept10.getChildren()) {
//System.out.println("三级信息:" + JSON.toJSONString(dept11));
}
}
}
}
}
//3
//一级信息:{"children":[{"children":[],"deptId":"10001","name":"肌骨疼痛康复门诊","parentId":"1000"},{"children":[{"children":[],"deptId":"100021","name":"脑卒中康复门诊-小门诊","parentId":"10002"},{"children":[],"deptId":"100022","name":"脑卒中康复门诊-小门诊-小小门诊","parentId":"10002"}],"deptId":"10002","name":"脑卒中康复门诊","parentId":"1000"}],"deptId":"1000","name":"康复中心门诊","parentId":"0"}
//一级信息:{"children":[],"deptId":"1001","name":"妇产科","parentId":"0"}
//一级信息:{"children":[{"children":[],"deptId":"10021","name":"颈肩腰腿痛专科门诊","parentId":"1002"},{"children":[],"deptId":"10022","name":"骨伤二科(康复六科)门诊","parentId":"1002"}],"deptId":"1002","name":"骨伤科","parentId":"0"}
}
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
public static List<Dept> buildDeptTree(List<Dept> depts) {
List<Dept> deptList = new ArrayList<>();
List<String> 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;
}
/**
* 递归列表
* 结束条件为所遍历的节点无下一级节点
*
* @param list 查询获得的所有部门数据
* @param dept 顶级节点
*/
private static void recursionFn(List<Dept> list, Dept dept) {
// 得到子节点列表
List<Dept> childList = getChildList(list, dept);
dept.setChildren(childList);
for (Dept tChild : childList) {
// 如果子节点有下一级节点,得到下一级的节点列表
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
/**
* 获得该节点的下一级子节点列表
*
* @param list 查询获得的所有部门数据
* @param dept 顶级节点
* @return 顶级节点的下一级子节点列表
*/
private static List<Dept> getChildList(List<Dept> list, Dept dept) {
List<Dept> deptList = new ArrayList<>();
for (Dept d : list) {
// 遍历非顶级节点,并获得传入参数顶级节点的下一级子节点列表
if (d.getParentId() != null && d.getParentId().equals(dept.getDeptId())) {
deptList.add(d);
}
}
return deptList;
}
/**
* 判断是否有子节点
*
* @param list 节点列表
* @param dept 部门节点
* @return Boolean
*/
private static boolean hasChild(List<Dept> list, Dept dept) {
return getChildList(list, dept).size() > 0;
}
}