部门树形结构算法 — Java递归实现
/**
* 构建前端所需要树结构
*
* @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;
}