树结构可以讲是最常见的数据结构了,常用在菜单/组织架构模块上,作为一个半路出家的程序员在这里就体现出基础薄弱的问题,这里Mark一下java树结构常用操作的代码,方便回忆:
1.递归组织树状结构
private List<Department> treeBuilder(List<Department> departments) {
List<Department> treeList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(departments)) {
Map<Long, List<Department>> group = group(departments);
List<Department> firstList = group.get((long) 1);
if (CollectionUtils.isNotEmpty(firstList)) {
for (Department first : firstList) {
Department department = new Department();
BeanUtils.copyProperties(first, department);
initChildren(department, group);
treeList.add(department);
}
}
}
return treeList;
}
private Map<Long, List<Department>> group(List<Department> departmentList) {
Map<Long, List<Department>> group = new HashMap<>(16);
if (CollectionUtils.isNotEmpty(departmentList)) {
for (Department department : departmentList) {
List<Department> departments = group.get(department.getParent_id());
if (CollectionUtils.isEmpty(departments)) {
departments = new ArrayList<>();
group.put(department.getParent_id(), departments);
}
departments.add(department);
}
}
return group;
}
private void initChildren(Department tree, Map<Long, List<Department>> group) {
List<Department> children = group.get(tree.getDept_id());
if (CollectionUtils.isNotEmpty(children)) {
List<Department> treeList = new ArrayList<>();
tree.setSubsidiaryDepartments(treeList);
for (Department child : children) {
Department department = new Department();
BeanUtils.copyProperties(child, department);
treeList.add(department);
//递归设置下级菜单
initChildren(department, group);
}
}
}
2.递归获取全部父级主键
private void getDepParentIds(List<Department> departmentList, Long depId, Set<Long> parentIds) {
//1.根据depId 得 parentId
Department department = getDepParentIdById(departmentList, depId);
Long parentId = department.getParent_id();
parentIds.add(parentId);
//最高一级部门的id为1退出递归
if (department.getDept_id().equals((long) 1)) {
return;
}
//2.根据parentId 得上级所有 ids
List<Long> Ids = new ArrayList<>();
for (Department dep : departmentList) {
if (dep.getParent_id().equals(parentId)) {
Ids.add(dep.getParent_id());
}
}
//3.递归到步骤1
for (Long id : Ids) {
getDepParentIds(departmentList, id, parentIds);
}
}
private Department getDepParentIdById(List<Department> departmentList, Long departmentId) {
for (Department dep : departmentList) {
if (dep.getDept_id().equals(departmentId)) {
return dep;
}
}
return new Department();
}
网友评论