• 2种方法将集合数据List构建成树形结构



    在这里插入图片描述

    递归循环构建树结构

    先查最外层树节点数据,再递归遍历每一层子节点数据

    public ApiResultDto<List<LocationDto>> getTreeByParams(LocationSearchDto searchDto, SecurityUser user) {
    		// 最外层的树结构【此最外层是BUILDING,也就是BUILDING的parentId为null】,不是获取所有数据,与下不同
            searchDto.setProjectId(user.getProjectId());
            searchDto.setType(LocationType.BUILDING);
            List<LocationEntity> locationEntities = locationDao.findByParams(searchDto);
            List<LocationDto> locationDtos = locationEntities.stream().map(t -> {
                LocationDto dto = new LocationDto();
                dto.setId(t.getId());
                dto.setName(t.getName());
                dto.setType(t.getType());
                dto.setSort(t.getSort());
                dto.setSerialNum(t.getSerialNum());
                dto.setCode(t.getCode());
                dto.setParentId(t.getParentId());
               // 循环递归获取子节点
                iterChild(dto, user.getProjectId());
                return dto;
            }).collect(Collectors.toList());
            return ApiResultDto.success(locationDtos);
        }
    
     	/**
         * 遍历子节点.
         *
         * @param dto 空间dto
         */
        private void iterChild(LocationDto dto, UUID projectId) {
    //  
            List<LocationEntity> locations = locationDao.findChildById(dto.getId());
            if (CollectionUtils.isEmpty(locations)) {
                return;
            }
            List<LocationDto> locationDtos = locations.stream().map(t -> {
                LocationDto childDto = new LocationDto();
                childDto.setId(t.getId());
                childDto.setName(t.getName());
                childDto.setType(t.getType());
                childDto.setSort(t.getSort());
                childDto.setSerialNum(t.getSerialNum());
                childDto.setCode(t.getCode());
                childDto.setParentId(t.getParentId());
                // 递归遍历子节点
                iterChild(childDto, projectId);
                return childDto;
            }).collect(Collectors.toList());
            dto.setChildren(locationDtos);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    hutool.TreeUtil.build构建树结构

       public ApiResultDto<List<Tree<UUID>>> getTreeByParams(LocationSearchDto searchDto, SecurityUser user) {
       		// 查询到所有数据
            searchDto.setProjectId(user.getProjectId());
            List<LocationEntity> entities = locationDao.findByParams(searchDto);
            // 获取非第一层"BUILDING"的数据的父级信息【查询到子节点,要带出对应的所有父节点,如果不需要可以删除】
            List<LocationEntity> locationEntities = new ArrayList<>();
            locationEntities.addAll(entities);
            for (LocationEntity entity : entities) {
                addParentEntities(entity, locationEntities);
            }
            locationEntities = locationEntities.stream().distinct().collect(Collectors.toList());
            // 构建树,主要数据在treeNode中,其余数据在extra字段中
            List<TreeNode<UUID>> nodeList = new ArrayList<>();
            for (LocationEntity entity : locationEntities) {
                TreeNode<UUID> treeNode = new TreeNode<>(entity.getId(), entity.getParentId(), entity.getName(), null);
                nodeList.add(treeNode);
                Map<String, Object> extra = new HashMap<>();
                extra.put("name", entity.getName());
                extra.put("serialNum", entity.getSerialNum());
                extra.put("code", entity.getCode());
                extra.put("type", entity.getType());
                extra.put("sort", entity.getSort());
                if (MapUtils.isNotEmpty(extra)) {
                    treeNode.setExtra(extra);
                }
            }
            List<Tree<UUID>> result = TreeUtil.build(nodeList, null);
            return ApiResultDto.success(result);
        }
    
    	/**
         * 获取当前空间实体额所有上级实体.
         *
         * @param entity 当前空间实体
         * @param res    结果
         */
        private void addParentEntities(LocationEntity entity, List<LocationEntity> res) {
            if (Objects.nonNull(entity) && Objects.nonNull(entity.getParentId())) {
                LocationEntity parentEntity = locationDao.selectById(entity.getParentId());
                if (Objects.nonNull(parentEntity)) {
                    res.add(parentEntity);
                    addParentEntities(parentEntity, res);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    为什么HTTP用得很好的,开始普及HTTPS呢?
    63. 不同路径 II java解决
    使用dispatchEvent解决重叠元素响应事件问题
    高并发下丢失更新的解决方案
    C++11之常量表达式(const与constexpr的区别)
    K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系
    5.9图书管理案例
    UE5.3报错
    (AVL)平衡二叉树
    .NET 邮件发送 SMTP邮件发送
  • 原文地址:https://blog.csdn.net/qq_21880261/article/details/139100606