构建树结构的几种方式

表结构

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;
    }
   
相关推荐
winlife_21 分钟前
全程用 AI 做一款商业级手游 · EP10 道具系统:让三个按钮真正改变棋盘
windows·算法·unity·ai编程·游戏开发·mcp·玩法系统
小二·1 小时前
Prompt Engineering 实战
网络·windows·prompt
fastjson_1 小时前
使用 ventoy 安装WinToGo
windows
Chase_______1 小时前
【Java杂项】Arrays.asList、List.of 和 new ArrayList:集合可变性避坑
java·windows·list
CodeStats2 小时前
从 CPU 指令执行到权限管控:对比三大操作系统,梳理编程语言演进,解读 HTML/CSS/JS 浏览器解析的共通底层逻辑
java·linux·windows
ziyitty2 小时前
解决Windows下Bash调用Python输出中文乱码的问题
windows·python·bash
charlie1145141912 小时前
通用GUI编程技术——图形渲染实战(四十九)——完全自绘控件架构:状态机与动画
c++·windows·架构·图形渲染
Java.熵减码农4 小时前
Windows 下 Node.js 安装与配置完全指南
windows·node.js
love530love11 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
CryptoPP12 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链