部门树形结构算法 — Java递归实现
将查询到的部门列表数据,进行父子节点树形结构排序
该功能适用需要树形结构的,不仅仅是部门树
步骤:
- 查询数据库,获得所有的部门列表
- 调用下面的实现方法
一、建表语句
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;
/**
* 部门实体
*
* @author 长歌
*/
public class Dept {
/**
* 部门id
*/
private String deptId;
/**
* 部门名称
*/
private String name;
/**
* 父部门id
*/
private String parentId;
/**
* 子部门
*/
private List<Dept> children = new ArrayList<>();
// get,set等方法省略
...
三、实现方法代码
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
public 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 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 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 boolean hasChild(List<Dept> list, Dept dept) {
return getChildList(list, dept).size() > 0;
}