构建树结构的几种方式

表结构

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;
    }
   
相关推荐
零意@2 小时前
ubuntu切换不同版本的python
windows·python·ubuntu
写bug的小屁孩3 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
hairenjing11235 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
plmm烟酒僧8 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Jtti11 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
小奥超人11 小时前
PPT文件设置了修改权限,如何取消权?
windows·经验分享·microsoft·ppt·办公技巧
hairenjing112320 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
九鼎科技-Leo1 天前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo1 天前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
黎明晓月1 天前
Java之字符串分割转换List
java·windows·list