部门树形结构算法 — 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 changge */ 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; }