部门列表转换为树结构问题

来源:7-2 部门层级树接口开发

Screenly

2019-05-13

老师好!

    public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList){
        if(CollectionUtils.isEmpty(deptLevelList)){
            return Lists.newArrayList();
        }
        Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create();
        List<DeptLevelDto> rootList = Lists.newArrayList();
        for (DeptLevelDto dto : deptLevelList){
            levelDeptMap.put(dto.getLevel(), dto);
            // 获取根节点的数据
            if(LevelUtil.ROOT.equals(dto.getLevel())){
                rootList.add(dto);
            }
        }
        // 按照seq从小到大排序
        Collections.sort(rootList, new Comparator<DeptLevelDto>() {
            @Override
            public int compare(DeptLevelDto o1, DeptLevelDto o2) {
                return o1.getSeq() - o2.getSeq();
            }
        });
        // 递归生成树
        transformDeptTree(rootList, LevelUtil.ROOT, levelDeptMap);
        return rootList;
    }

最后递归生成树之后,rootList 中的数据为何就带有子部门的信息了?transformDeptTree 方法是 void的类型的,这里有点迷糊,请老师指点

写回答

1回答

Jimin

2019-05-13

你好,不晓得你是否了解java里的参数引用传递,我们这里返回void还能完成子节点数据的递归组装,核心用的就是引用传递,具体来说就是不停的处理当前节点的子节点,每一次操作都是在已有节点上进行更新,由于传递的参数都是引用传递,因此每递归一层都是更新上一层数据的属性(子节点),从更高的视角来看,就是定义好根节点后,之后所有的递归都是在更新这个子节点的属性而已,因此根本不需要返回值也可以完成树的构建,

0
1
Screenly
明白了,后来通过debug想通了,谢谢老师耐心讲解!!
2019-05-13
共1条回复

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2260 学习 · 1347 问题

查看课程