构建树结构的几种方式

表结构

sql 复制代码
CREATE TABLE `sys_dept` (
  `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `pid` bigint(20) DEFAULT NULL COMMENT '上级部门',
  `sub_count` int(5) DEFAULT '0' COMMENT '子部门数目',
  `name` varchar(255) NOT NULL COMMENT '名称',
  `dept_sort` int(5) DEFAULT '999' COMMENT '排序',
  `enabled` bit(1) NOT NULL COMMENT '状态',
  `create_by` varchar(255) DEFAULT NULL COMMENT '创建者',
  `update_by` varchar(255) DEFAULT NULL COMMENT '更新者',
  `create_time` datetime DEFAULT NULL COMMENT '创建日期',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`dept_id`) USING BTREE,
  KEY `inx_pid` (`pid`),
  KEY `inx_enabled` (`enabled`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='部门';
java 复制代码
 @Test
    public void getDeptTree() {
        List<Dept> list = new ArrayList();
        Set<Dept> parent = new LinkedHashSet<>();
        // 获取所有的部门信息
        List<Dept> deptList = deptMapper.getAllDepts();

        for (Dept dept : deptList) {
            Dept dept1 = buildParentTree(dept, deptList);
            if (dept1 != null) {
                parent.add(dept1);
            }
        }

        // 构建部门树
//       List<Dept> deptTreeList =  deptList.stream()
//               .filter((dept)-> dept.getPid() == null)
//               .collect(Collectors.toList());
        for (Dept tree : parent) {
            Dept dept = buildDeptTree(tree, deptList);
            list.add(dept);
        }

        for (Dept dept : list) {
            System.out.println("dept - - - - >" + dept);
        }


    }

    private Dept buildParentTree(Dept dept, List<Dept> deptList) {
        Dept dept12 = dept;
        for (Dept dept1 : deptList) {
            if (dept.getPid().equals(dept1.getId())) {
                dept12 = buildParentTree(dept1, deptList);
            }
        }
        return dept12;

    }

    /**
     * 构建部门树
     *
     * @param dept
     * @param deptList
     * @return
     */
    private Dept buildDeptTree(Dept dept, List<Dept> deptList) {

        List<Dept> list = new ArrayList();
        for (Dept dept1 : deptList) {
            if (dept1.getPid().equals(dept.getId())) {
                list.add(buildDeptTree(dept1, deptList));
            }
        }
        dept.setChildren(list);

        return dept;
    }
java 复制代码
    // 使用第二种方法
    @Test
    public void tree() {
        // 获取所有的部门信息
        List<Dept> deptList = deptMapper.getAllDepts();

        List<Dept> collect = deptList.stream().filter((dept) -> dept.getPid() == null)
                .map((dept) -> {
                    dept.setChildren(buildTree(dept, deptList));
                    return dept;
                }).sorted((dept1, dept2) -> {
                    return dept1.getDeptSort() - dept2.getDeptSort();
                })
                .collect(Collectors.toList());

        for (Dept dept : collect) {
            System.out.println(dept);
        }
    }

    private List<Dept> buildTree(Dept dept, List<Dept> deptList) {

        List<Dept> collect = deptList.stream().filter((deptvo) -> {
            return deptvo.getPid() == dept.getId();
        }).map((item) -> {
            item.setChildren(buildTree(item, deptList));
            return item;
        }).sorted((dept1, dept2) -> {
            return dept1.getDeptSort() - dept2.getDeptSort();
        })
                .collect(Collectors.toList());
        return collect;
    }
java 复制代码
    // 第三种
    @Test
    public void buildTree(){
        List<Dept> allDepts = deptMapper.getAllDepts();
        // 构建父子关系
        Map<Long,Dept> map = new HashMap<>();
        for (Dept dept : allDepts) {
            map.put(dept.getId(),dept);
        }

        List<Dept> deptList = new ArrayList<>();
        for (Dept dept : allDepts) {
            if (dept.getPid() == null){
                dept.setChildren(buildChildrenTree(dept.getId(),map));
                deptList.add(dept);
            }
        }
        log.info("构建树资源:{}",allDepts);
        for (Dept allDept : allDepts) {
            System.out.println(allDept);
        }
    }

    private List<Dept> buildChildrenTree(Long parentId, Map<Long, Dept> map) {

        List<Dept> children = new ArrayList<>();
        for (Dept dept : map.values()) {
            if (parentId == dept.getPid()){
                buildChildrenTree(dept.getId(),map);
                children.add(dept);
            }
        }
        return children;
    }
   
相关推荐
阿白的白日梦4 天前
winget基础管理---更新/修改源为国内源
windows
埃博拉酱8 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21889 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号39 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
tryCbest9 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅9 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技9 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf
一个人旅程~9 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
一个假的前端男9 天前
[特殊字符] Flutter 安装完整指南 Windows—— 2026最新版
windows·flutter
倚肆9 天前
在 Windows Docker 中安装并配置 Nginx (映射 Windows 端口与路径)
windows·nginx·docker