Java 通过map构造树形结构

2023-05-16

在开发中,经常会有将 数据组装成为树形结构的场景,除了可以通过递归实现,还可以通过map 组装实现。

一,构造基本数据



import apple.laf.JRSUIUtils;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;


/**
 * @创建人 
 * @创建时间 2020/5/25
 * @描述
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TreeVo {

    private int id;
    private String name;
    private int parent;
    private List<TreeVo> children;


    public static List<TreeVo> allTreeVoList() {

        List<TreeVo> list = Lists.newArrayList();
        TreeVo heBeiTreeVo = TreeVo.builder().id(1).name("河北").parent(0).children(Lists.newArrayList()).build();
        list.add(heBeiTreeVo);
        TreeVo hanTreeVo = TreeVo.builder().id(2).name("邯郸").parent(1).children(Lists.newArrayList()).build();
        list.add(hanTreeVo);
        TreeVo weiTreeVo = TreeVo.builder().id(3).name("魏县").parent(2).children(Lists.newArrayList()).build();
        list.add(weiTreeVo);
        TreeVo beiTreeVo = TreeVo.builder().id(4).name("北京").parent(0).children(Lists.newArrayList()).build();
        list.add(beiTreeVo);
        TreeVo jingTreeVo = TreeVo.builder().id(5).name("北京市").parent(4).children(Lists.newArrayList()).build();
        list.add(jingTreeVo);
        TreeVo chaoTreeVo = TreeVo.builder().id(6).name("朝阳区").parent(5).children(Lists.newArrayList()).build();
        list.add(chaoTreeVo);
        return list;
    }
}

二,通过map分组遍历

 /**
     * 组装树
     */
    public void wrapperTreeTest() {
        Gson gson = new Gson();
        List<TreeVo> list = TreeVo.allTreeVoList();
        logger.info("结果是:{}", gson.toJson(list));
        Map<Integer, TreeVo> treeVoMap = list.stream().collect(Collectors.toMap(i -> i.getId(), i -> i));
        //获取顶级树节点
        List<TreeVo> rootList = list.stream().filter(i -> !treeVoMap.containsKey(i.getParent())).collect(toList());
        logger.info("rootList is:{}", gson.toJson(rootList));
        for (TreeVo treeVo : list) {
            if (treeVoMap.containsKey(treeVo.getParent())) {
                TreeVo parentTree = treeVoMap.get(treeVo.getParent());
                List<TreeVo> children = parentTree.getChildren();
                children.add(treeVo);
            }
        }
        logger.info("最后树结构是:{}", gson.toJson(rootList));
    }

三,结果是

[
    {
        "id":1,
        "name":"河北",
        "parent":0,
        "children":[
            {
                "id":2,
                "name":"邯郸",
                "parent":1,
                "children":[
                    {
                        "id":3,
                        "name":"魏县",
                        "parent":2,
                        "children":[

                        ]
                    }
                ]
            }
        ]
    },
    {
        "id":4,
        "name":"北京",
        "parent":0,
        "children":[
            {
                "id":5,
                "name":"北京市",
                "parent":4,
                "children":[
                    {
                        "id":6,
                        "name":"朝阳区",
                        "parent":5,
                        "children":[

                        ]
                    }
                ]
            }
        ]
    }
]

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 通过map构造树形结构 的相关文章

随机推荐

  • 关于编程学习上的一些感悟——不忘初心

    序 今天无意中看到以前一起开发过的同学写的技术文章 xff0c 了解到了更多在blog和github以及一些技术交流论坛上面非常活跃 回过头来看看自己 xff0c 好像依然停留在以前的样子 xff0c 似乎与真正在踏实学技术差距好像很大了
  • CentOS下ns-3安装教程

    首先 xff0c 安装ns 3时最好不要使用root权限 xff0c 普通用户安装即可 xff0c 否则后来要找文件会比较麻烦 一 安装依赖软件包 首先安装依赖软件包 根据官网 xff08 https www nsnam org wiki
  • 生产者-消费者模型

    文章来自https github com NieJianJian AndroidNotes xff0c 内容将持续更新 xff0c 欢迎star 一 前言 生产者消费者模式并不是GOF提出的23种设计模式之一 xff0c 23种设计模式都是
  • JAVA 多线程解决高并发、超时线程池耗尽问题

    第一类 问题 项目中遇到了 创建20个固定线程的线程池 在测试环境 多线程如果高并发的调用都没出现问题 但是在实际的项目中 出现了线程池内线程超时等待并将池内的线程耗尽 导致其它的程序走到多线程调用时候出现了执行慢 线程无法执行问题 问题原
  • 31_谈谈你对线程安全的理解?(重点)

    如果这个是面试官直接问你的问题 xff0c 你会怎么回答 xff1f 一个专业的描述是 xff0c 当多个线程访问一个对象时 xff0c 如果不用进行额外的同步控制或其他的协调操作 xff0c 调用这个对象的行为都可以获得正确的结果 xff
  • MariaDB 数据类型

    MariaDB 数据类型 数字数据类型 MariaDB支持的数字数据类型如下 类型描述TINYINT此数据类型表示落入 128到127的有符号范围内的小整数 xff0c 以及0到255的无符号范围 BOOLEAN此数据类型将值0与 fals
  • DBSCAN算法(python代码实现)

    DBSCAN 上次学了kmeans基于划分的方法 xff0c 这次学一个基于密度的聚类算法 xff1a DBSCAN xff08 Density Based Spatial Clustering of Applications with N
  • vs2022(缺少MFC,无法新建项目,控件无法添加事件)的解决

    最近下载安装了最新的vs2022社区版 xff0c 想着把之前的c 43 43 项目能够兼容 xff0c 于是遇到了一些列问题 缺少MFC xff0c 无法新建项目 xff0c 控件无法添加事件 这里首先要吐槽一下 xff1a 也许是我电脑
  • C#多线程加载控件界面卡死的解决

    先听一个故事 xff1a 有一个老板忙不过来 xff0c 于是招一个员工去负责某些事务 这样老板就可以腾出时间处理其它事 后来发现员工干不下去 xff0c 原因是干活需要花费 xff0c 没有老板的认可 xff0c 财务不给批钱 这是原则
  • vs2022账户无法登录的解决

    因为昨天重做系统 xff0c 重装了vs2022 xff0c 又涉及到登录的问题 xff0c 一时想不起来之前怎么解决的了 xff0c 想起来以后决定还是记录下来 我遇到的问题是下面这样的 xff0c 提示脚本错误 xff0c 要求升级最新
  • 使用centos7+bind9构建内网私有dns

    有这样一种场景 xff0c 局域网内有一个为网内用户提供服务的机器 xff0c 我们希望像访问互联网站点一样去访问它 xff0c 而不用记忆ip地址和端口 xff0c 比如在web浏览器地址栏输入http www nx com就可以访问它
  • PowerBuilder制作纸牌游戏

    本文记录的是2001年我大三那年假期制作小游戏的思路 xff0c 希望给在读计算机专业的朋友们一些参考 xff0c 如果还没来得及动手尝试的同学 xff0c 一定要勇于动手 你们一定比我做得更好 制作动力 xff1a 我有一个好朋友 xff
  • 【Qt线程-1】this,volatile,exec(),moveToThread()

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 2 事件循环 xff08 QCoreApplication processEvents xff0c exec xff09 的应用 Qt线程 3 使
  • 【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 3 使用事件循环 xff0c 信号 xff0
  • 【Qt线程-4】事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 2 事件循环 xff08 QCo
  • 【Qt样式(qss)-3】几套配色方案

    背景 xff1a 之前写过有关qss的博客 xff0c 记录了如何使用qt手册 xff0c 以及在项目中如何使用qss的体验 经过实践 xff0c 我归纳了自己需要的qss使用方法 xff0c 使之尽量高效 xff0c 容易维护 Qt样式
  • 【Qt样式(qss)-4】应用到QMdiArea不生效的解决

    背景 xff1a 之前写记录过几篇qss相关内容 xff1a Qt样式 xff08 qss xff09 1 手册小结 xff08 附例 xff1a 软件深色模式 xff09 Qt样式 xff08 qss xff09 2 使用小结 xff08
  • Google play billing(Google play 内支付) 下篇

    开篇 xff1a 如billing开发文档所说 xff0c 要在你的应用中实现In app Billing只需要完成以下几步就可以了 第一 把你上篇下载的AIDL文件添加到你的工程里 xff0c 第二 把 lt uses permissio
  • Qt creator中操作QAction加入QToolBar

    背景 xff1a 个人笔记 我之前没有系统化学习过任何资料 xff0c 使用很多工具都是按需出发 xff0c 直接上手 xff0c 遇到问题再研究的 所以会有一些弯路 本文言语中难免有对个人情绪的生动描述 xff0c 希望不要影响读者心情
  • Java 通过map构造树形结构

    在开发中 xff0c 经常会有将 数据组装成为树形结构的场景 xff0c 除了可以通过递归实现 xff0c 还可以通过map 组装实现 一 xff0c 构造基本数据 import apple laf JRSUIUtils import co