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

文章目录

  • 递归循环构建树结构
  • hutool.TreeUtil.build构建树结构

在这里插入图片描述

递归循环构建树结构

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

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) {
//  <select id="findChildById"
//        parameterType="map" resultType="common.po.location.LocationEntity">
//        select *
//        from location
//        where model_status = 1
//        and parent_id = #{id}
//    </select>
        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);
    }

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);
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十六天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860.柠檬水找零 文档讲解&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 注意看提示&#xff1a; bills[i] 不是 5 就是 10 或是 20 场景较为固定 遇到了20&#xff0c;优先消耗10 class Solution:def lemonadeChange(self, bills: …

秋招突击——算法——模板题——区间DP——合并石子

文章目录 题目内容思路分析实现代码分析与总结 题目内容 思路分析 基本思路&#xff0c;先是遍历区间长度&#xff0c;然后再是遍历左端点&#xff0c;最后是遍历中间的划分点&#xff0c;将阶乘问题变成n三次方的问题 实现代码 // 组合数问题 #include <iostream> #in…

宝塔Linux下安装EMQX服务并设置匿名访问

简述 之前有在Windows和Linux下搭建过EMQX服务并且使用方面都没问题,但那都是使用的用户和密码方式访问,且前提都是通过浏览器进入EMQX的配置页面设置的属性; 但这次使用的是腾讯云租用的宝塔Liniux,由于没有浏览器只能通过命令行方式修改EMQX配置以达到目的;由于事先没看…

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码 FunCaptcha 以其复杂的图像验证而闻名&#xff0c;对自动化系统构成了巨大的挑战。CapSolver 的 API 服务利用先进的 AI 技术轻松应对和解决 FunCaptcha 挑战。本指南探讨了 CapSolver 如何实现无缝自动化&#xff…

汇聚荣科技有限公司优点有哪些?

在当今快速发展的科技时代&#xff0c;企业之间的竞争愈发激烈。作为一家专注于科技创新与研发的公司&#xff0c;汇聚荣科技有限公司凭借其卓越的技术实力和创新能力&#xff0c;在业界树立了良好的口碑。那么&#xff0c;汇聚荣科技有限公司究竟有哪些优点呢?接下来&#xf…

XX数字中台技术栈及能力

XX数字中台技术栈及能力 1 概述 XX数字中台面向数据开发者、数据管理者和数据应用者&#xff0c;提供数据汇聚、融合、治理、开发、挖掘、共享、可视化、智能化等能力&#xff0c;实现数据端到端的全生命周期管理&#xff0c;以共筑数字基础底座&#xff0c;共享数据服务能力…

The Missing Semester of Your CS Education(计算机教育中缺失的一课)

Shell 工具和脚本(Shell Tools and Scripting) 一、shell脚本 1.1、变量赋值 在bash中为变量赋值的语法是foobar&#xff0c;访问变量中存储的数值&#xff0c;其语法为 $foo。 需要注意的是&#xff0c;foo bar &#xff08;使用空格隔开&#xff09;是不能正确工作的&…

llama-factory学习个人记录

框架、模型、数据集准备 1.llama-factory部署 # 克隆仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git # 创建虚拟环境 conda create --name llama_factory python3.10 # 激活虚拟环境 conda activate llama_factory # 安装依赖 cd LLaMA-Factory pip install -…

Java 使用继承和重写父类方法写一个商品入库案例

package 练习.商品入库;import java.util.Scanner; // 抽象手机类 public abstract class Phone {//测试方法public static void main(String[] args){// 华为手机huawei h new huawei();h.setName("华为P40");h.setPrice(1999.99);h.setConfiguration("8128GB…

Go知识点复习

Go知识点复习 1.关于包的使用和GOPATH的配置 src:用于以代码包的形式组织并保存Go源码文件, 需要手动创建pkg目录&#xff1a;用于存放经由go install命令构建安装后的代码包&#xff08;包含Go库源码文件&#xff09;的“.a”归档文件bin目录&#xff1a;与pkg目录类似&…

kind: Telemetry

访问日志 访问日志提供了一种从单个工作负载实例的角度监控和理解行为的方法。 Istio 能够以一组可配置的格式为服务流量生成访问日志&#xff0c; 使操作员可以完全控制日志记录的方式、内容、时间和地点。 有关更多信息&#xff0c;请参阅获取 Envoy 的访问日志。 https:/…

ThingsBoard如何拆分前后端分离启动

后端启动 前端启动 注意事项 ThingsBoard是一个开源的物联网平台&#xff0c;它原本的设计就考虑到了现代Web应用的前后端分离架构。尽管其核心是一个后端服务&#xff0c;负责设备连接、数据处理和存储等&#xff0c;但其用户界面是作为单独的前端应用程序实现的&#xff0c…

Windows下部署Seata1.5.2,解决Seata无法启动问题

目录 1. 版本说明 2. Windows下部署Seata1.5.2 2.1 创建回滚日志表undo_log 2.2 创建Seata服务端需要的四张表 2.3 在nacos创建seata命名空间&#xff0c;添加seataServer.yml配置 2.4 修改本地D:/tool/seata-server-1.5.2/seata/conf/applicaltion.yml文件 2.5 启动Seat…

抖音运营_抖音电商介绍

截止20年8月&#xff0c;抖音的日活跃数高达6亿。 20年6月&#xff0c;上线抖店 &#xff08;抖音官方电商&#xff09; 一 抖店的定位和特色 1 一站式经营 帮助商家进行 商品交易、店铺管理、客户服务 等全链路的生意经营 2 多渠道拓展 抖音、今日头条、西瓜、抖音火山版…

markdown 文件渲染工具推荐 obsidian publish

背景 Markdown 是一种轻量级的标记语言&#xff0c;最开始使用它是觉得码字非常方便&#xff0c;从一开始的 word 排版到 markdown &#xff0c;还不太不习惯&#xff0c;用了 obsidian把一些文字发在网上后&#xff0c;才逐渐发现他的厉害之处。 让人更加专注于内容本身&…

信号:MSK调制和GMSK调制

目录 一、MSK信号 1. MSK信号的第k个码元 2.MSK信号的频率间隔 3.MSK信号的相位连续性 3.1 相位路径 3.2初始相位ψk 4.MSK信号的产生 原理框图 5.MSK信号的频谱图 二、高斯最小频移键控(GMSK) 1.频率响应 2.GMSK调制产生方式 2.1 高斯滤波器法 2.2 正交调制器法…

激光雷达SLAM算法综述

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

Android Ktor 网络请求框架

Ktor 是一个由 JetBrains 开发的用于 Kotlin 编程语言的应用框架&#xff0c;旨在创建高性能的异步服务器和客户端应用程序。由于完全基于 Kotlin 语言&#xff0c;Ktor 能够让开发者编写出简洁、可读性强且功能强大的代码&#xff0c;特别适合那些已经熟悉 Kotlin 的开发人员。…

《SpringBoot》系列文章目录

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;旨在简化新Spring应用的初始搭建以及开发过程。以下是一些关于SpringBoot的详细介绍&#xff1a; 设计目的&#xff1a;SpringBoot通过特定的方式来进行配置&#xff0c;使得开发人员不再需要定义样板化的配置&#xff0c…

uniappx 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等) Ba-IdCode-U

简介&#xff08;下载地址&#xff09; Ba-IdCode-U 是一款可以获取国内各大手机厂商 OAID&#xff08;开放匿名设备标识&#xff09;及海外手机平台 AAID&#xff08;安卓广告标识&#xff09;的uniapp插件。另外也支持获取 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUI…