Java树结构常用操作代码实战

树结构可以讲是最常见的数据结构了,常用在菜单/组织架构模块上,作为一个半路出家的程序员在这里就体现出基础薄弱的问题,这里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();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容