构建树结构的几种方式

表结构

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;
    }
   
相关推荐
ceffans9 分钟前
PDF文档中文本解析
c++·windows·pdf
SummerGao.15 分钟前
Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
c++·windows·qt·cmake·visual studio·setup factory
Igallta_8136222 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
wave_sky3 小时前
Visual Studio中打开多个项目
ide·windows·visual studio
donglxd4 小时前
防御黑客系列-第一集-电脑登录记录提示和登录远程推送
windows·网络安全·电脑·系统安全
iOS技术狂热者5 小时前
如何通过Windows环境远程控制MusicGPT在线生成高质量AI音乐
人工智能·windows
Zucker n9 小时前
deepseek本地调用
java·服务器·windows
我真不会起名字啊10 小时前
“深入浅出”系列之C++:(8)libevent 库
开发语言·c++·windows
a41324471 天前
亲测Windows部署Ollama+WebUI可视化
windows·ollama·open-webui·deepseek本地化部署
※※冰馨※※1 天前
【C#】无法安装程序包“DotSpatial.Symbology 4.0.656”
windows·microsoft·c#