將查詢到的部門列表數據,進行父子節點樹形結構排序
該功能適用需要樹形結構的,不僅僅是部門樹
步驟:
- 查詢數據庫,獲得所有的部門列表
- 調用下面的實現方法
一、建表語句
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;
}