使用递归将list转换成tree

在产品研发时遇到这样一个问题,对于省市区县这类三级联动的数据,前端插件需要一次把数据全部返回,单纯的使用接口查询字节的没办法满足要求。

如果一次把数据全部返回,前端使用起来很麻烦需要一条一条的进行查找。

常规的使用方法是把集合转换成一个有结构的树形结构。

树形结构是一种非线性的数据结构,它由n(n>=0)个有限结点组成,这些结点之间具有层次关系。每个结点可以有零个或多个子结点,其中根结点是层次最高的结点,没有父结点,其他结点有且仅有一个父结点。在树形结构中,子结点的数量被称为该节点的度,树的度是树中最大的度数。树的深度或高度是指树中结点的最大层次数。

实体类

@Data
public class AreaVO implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private Integer pid;

    private String areaCode;

    private String areaName;

    private Integer level;

    private List<AreaVO> childList;

}

TreeUtil


import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author zhizhao
 * @description
 * @create 2018-11-14 9:07
 */
public class TreeUtil {

    public static List<AreaVO> toTree(List<AreaVO> treeNodeList) {
        //数据按照pid分组
        Map<Integer, List<AreaVO>> map = treeNodeList.stream().collect(Collectors.groupingBy(AreaVO::getPid));
        //找出所有的根节点,pid=0的为根节点
        List<AreaVO> areaList = map.get(0);
        for (AreaVO areaVO : areaList) {
            forEach(map, areaVO);
        }
        return areaList;
    }

    private static void forEach(Map<Integer, List<AreaVO>> collect, AreaVO areaVO) {
        List<AreaVO> nodeList = collect.get(areaVO.getId());
        if (collect.get(areaVO.getId()) == null) {
            return;
        }
        areaVO.setChildList(nodeList);
        for (AreaVO node : nodeList) {
            forEach(collect, node);
        }
    }

}

转换输出结果

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

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

相关文章

使用visio画图基础(更新中)

1、画基本图形&#xff1a;正方形长方形&#xff0c;直线虚线 1、在形状这里选中后出现基本形状界面&#xff0c;拖动即可 画直线、虚线修改直线的样式改为虚线即可。 2、在矩形中画网格 先画一个矩形&#xff0c;然后选中&#xff0c;按照箭头选择排列形状。设置3*3。 双击可…

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式 前提docker环境已经安装好 如未安装&#xff0c;请参考博文https://blog.csdn.net/a554521655/article/details/134251763 文章目录 ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式安装emqx查看是否安装并启动成功登录前端查 安…

凸优化Convex Optimization期末复习重点和考试笔记(二)凸优化+对偶

接博客【凸优化Convex Optimization期末复习重点和考试笔记&#xff08;一&#xff09;凸集凸函数】 第三部分&#xff1a;凸优化 第四部分&#xff1a;对偶 几种典型的凸函数 以上就是凸优化和对偶函数部分&#xff0c;以及几种常见的凸函数。我们就考到这所以后面的没有整理…

进销存+小程序商城:实现批发零售企业的互联网转型与管理升级

在当今互联网高速发展的时代&#xff0c;越来越多的批发零售企业开始开始考虑转型。在这个行业中&#xff0c;企业要想取得更好的发展&#xff0c;就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化&#xff0c;企业可以更好地满足…

Java项目:117SpringBoot动漫论坛网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 117SpringBoot动漫论坛网站 一、项目介绍 动漫论坛网站是由SpringBootMybatis开发的&#xff0c;旅游网站分为前台和后台&#xff0c;前台为用户浏览&#xff0c;后台进…

大小论文over,坐等毕业。写点ROS上建图与导航的心得,也不知道对错,欢迎讨论~(对,谨慎阅读,不存在误人子弟哈~.~)

大小论文总算是都搞定了&#xff0c;院审过了送外审了&#xff0c;生死有命富贵在天&#xff0c;希望外审专家大佬们高抬贵手o.O~ 我所理解的建图算法的移植&#xff0c;能不能运行起来&#xff0c;大框架上就是把一棵完整的坐标转换关系的TF树给整理“通顺”&#xff0c;TF&am…

springboot3(二、StreamAPI)

文章目录 一、StreamAPI1.介绍2.代码示例 二、基本用法1.创建流2.流并发3.流并发问题 三、流方法1.中间操作2.终止操作 一、StreamAPI StreamAPI这种函数式编程是声明式编程&#xff0c;声明式编程是一种编程范式&#xff0c;它着重于描述问题的"是什么"&#xff0c…

深入理解.NET框架中的CLR(公共语言运行时)

深入理解.NET框架中的CLR&#xff08;公共语言运行时&#xff09; 引言 .NET框架中的CLR&#xff08;公共语言运行时&#xff09;是.NET应用程序运行的核心。本文将继续探索CLR的核心功能&#xff0c;并详细介绍.NET程序启动时是如何自动加载关键的库和服务来提供这些功能的。…

初识QT。

文章目录 前言一、QWidget1、了解内容main文件中的基本内容。.pro项目文件的内容。mywidget.h文件内容。命名规范和快捷键Qt助手 2、button按钮3、对象树4、信号和槽5、自定义信号和槽函数拓展 6、Lambda表达式7、练习 二、QMainWindow1、菜单栏和菜单项2、工具栏3、状态栏4、铆…

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

启用Hyper-V的三种方法,总有一种适合你

想在Windows 10计算机上的虚拟机中安装并运行Linux或更早版本的Windows操作系统吗&#xff1f;你将很高兴知道&#xff0c;你不需要第三方虚拟化软件&#xff08;如VirtualBox&#xff09;来在Windows 10上安装和运行Linux和Windows。 Windows 10中的内置Hyper-V工具允许你创建…

Android Studio 实现飞机大战游戏App

&#x1f345;文章末尾有获取完整项目源码方式&#x1f345; 目录 前言 一、运行演示 二、开发环境 三、完成步骤 步骤 1&#xff1a;创建项目 步骤 2&#xff1a;创建包名 步骤 3&#xff1a;实现启动页 步骤 5&#xff1a;实现用户注册 步骤 6&#xff1a;实现用户登…

逃离支原体又陷入流感 | 揭秘呼吸道感染与肠道菌群的隐秘关联

谷禾健康 成人每年大约会患上两到三次普通感冒&#xff0c;儿童每年可能会患上多达八次。而今年尤为显著&#xff0c;各大医院的儿科还是爆满状态&#xff0c;甚至是一号难求。 肺炎支原体感染还没彻底过去&#xff0c;紧接着流感和其他呼吸道病原体感染又跟来了&#xff0c;医…

ffmpeg写YUV420文件碰到阶梯型横线或者条纹状画面的原因和解决办法

版权声明&#xff1a;本文为CSDN博主「文三~」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/asdasfdgdhh/article/details/112831581 留作备份 阶梯型横线&#xff1a; 条纹状画面…

vue前端开发自学,父子组件之间的数据传递demo

vue前端开发自学,父子组件之间的数据传递demo!下面为大家展示的是&#xff0c;vue开发中常见的&#xff0c;父子级别关系的&#xff0c;数据 传递案例。先给大家看一下&#xff0c;源码&#xff0c;然后讲解一下里面的注意事项。 <template><h3>Parent</h3>…

耐高压达林顿输出光隔离器TLP187(TPL,E(O 功能介绍及其应用

TLP187(TPL,E(O 是一款达林顿晶体管耦合器&#xff0c;它因采用了 SO6封装而实现了外形的小巧化&#xff0c;也可以保证高温运转的可行性 &#xff08;Ta110degG最大值)。TLP187可以取代其前一代产品&#xff0c;即现有的TIP127型号。该产品的的焊盘尺寸与现有的MFSOP时装参考尺…

ajax+axios——统一设置请求头参数——添加请求头入参——基础积累

最近在写后台管理系统&#xff08;我怎么一直都只写管理系统啊啊啊啊啊啊啊&#xff09;&#xff0c;遇到一个需求&#xff0c;就是要在原有系统的基础上&#xff0c;添加一个仓库的切换&#xff0c;并且需要把选中仓库对应的id以请求头参数的形式传递到每一个接口当中。。。 …

启动redis出现Creating Server TCP listening socket 127.0.0.1:6379: bind: No error异常

1.进入redis安装目录&#xff0c;地址栏输入cmd 2.输入命令 redis-server.exe redis.windows.conf redis启动失败 解决&#xff0c;输入命令 #第一步 redis-cli.exe#第二步 shutdown#第三步 exit第四步 redis-server.exe redis.windows.conf 显示以下图标即成功

【论文阅读】Deep Graph Infomax

目录 0、基本信息1、研究动机2、创新点2.1、核心思想&#xff1a;2.2、思想推导&#xff1a; 3、准备3.1、符号3.2、互信息3.3、JS散度3.4、Deep InfoMax方法3.5、判别器&#xff1a;f-GAN估计散度 4、具体实现4.1、局部-全局互信息最大化4.2、理论动机 5、实验设置5.1、直推式…

Linux第25步_在虚拟机中备份“ST官方的TF-A源码”

TF-A是ARM公司提供的&#xff0c;ST公司通过修改它&#xff0c;做了一个自己的TF-A代码。因为在后期开发中&#xff0c;若硬件被改变了&#xff0c;我们需要通过修改"ST官方的TF-A源码"就可以自己的TF-A代码了。为了防止源文件被误改了&#xff0c;我们需要将"S…
最新文章