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构造树形结构 的相关文章

随机推荐

  • ROS 进阶之 tf变换

    TF变换 一 http www guyuehome com 355 http www guyuehome com 279 world 坐标系 二 广播TF变换 1 广播tf变换 向系统中广播参考系之间的坐标变换关系 系统中更可能会存在多个不
  • 易扩展的SLAM框架-OpenVSLAM

    本文介绍了一种具有较高可用性和可扩展性的可视化SLAM框架 OpenVSLAM 视觉SLAM系统对于AR设备 机器人和无人机的自主控制等是必不可少的 然而 传统的开源视觉SLAM框架并没有像从第三方程序调用的库那样进行适当的设计 为了克服这
  • GVINS:基于GNSS视觉惯性紧耦合的平滑状态估计方法

    文章 xff1a GVINS Tightly Coupled GNSS Visual Inertial Fusion for Smooth and Consistent State Estimation 作者 xff1a Shaozu Ca
  • opencv中ArUco模块实践(1)

    论文阅读模块将分享点云处理 xff0c SLAM xff0c 三维视觉 xff0c 高精地图相关的文章 公众号致力于理解三维视觉领域相关内容的干货分享 xff0c 欢迎各位加入我 xff0c 我们一起每天一篇文章阅读 xff0c 开启分享之
  • ROS2入门之基本介绍

    论文阅读模块将分享点云处理 SLAM 三维视觉 高精地图相关的文章 公众号致力于理解三维视觉领域相关内容的干货分享 欢迎各位加入我 我们一起每天一篇文章阅读 开启分享之旅 有兴趣的可联系微信dianyunpcl 163 com 前言 201
  • ikd-Tree:增量KD树在机器人中的应用

    文章 xff1a ikd Tree An Incremental K D Tree for Robotic Applications 作者 xff1a Yixi Cai Wei Xu and Fu Zhang 编译 xff1a 点云PCL
  • 视觉SLAM从传统到语义方法的概述

    文章 xff1a An Overview on Visual SLAM From Tradition to Semantic 作者 xff1a Weifeng Chen Guangtao Shang Aihong Ji Chengjun Z
  • Android 11 PackageManagerService源码分析(二):Packages.xml详解

    1 开篇 在上一篇文章中提到Settings类会在PackageManagerService启动过程中对packages xml等一些列xml文件进行解析 那么有以下问题 xff1a 这些文件记录了什么内容 xff1f 为什么需要这些文件
  • 【Python】eval的作用及NameError: name '变量名' is not defined

    在个人Python 的学习中 xff0c 通过记录总结 xff0c 提高自己的知识储备 xff0c 和学习能力 解决和解释三个小问题 xff1a 1 input与raw input 的区别 2 while循环 3 eval 的作用是什么 x
  • 【Python】使用网络调试助手传输数据(UDP协议)

    目录 1 发送与接收数据代码 2 网络调试助手配置 3 网络通信的流程 1 发送与接收数据代码 导入socket模块 import socket 判断程序入口 if name 61 61 39 main 39 创建套接字 xff0c AF
  • 课程设计——学生成绩管理系统 C语言

    课程设计 学生成绩管理系统 基本要求 xff1a 1 程序功能 编程实现一个基础的成绩管理系统 2 设计目的 通过本程序综合掌握结构体类型 指针 函数 文件等知识的综合使用 3 功能要求 可扩充功能 1 实现简单的菜单设计 如下所示 1添加
  • Foxmail登陆失败-NO LOGIN Login error password error

    问题描述 xff1a 因为今天在一个项目中需要用到邮箱的客户端授权码 xff0c 所以我在网易邮箱网页版中设置了授权码 xff0c 但是在后来在Foxmail客户端收取邮件时出现了问题 xff1a 我确定自己没有改过密码 xff0c 所以又
  • 远程登录阿里云服务器时,提示Permission denied, please try again.

    在使用ssh命令 xff0c 远程登录阿里云服务器时 xff0c 提示Permission denied please try again 百分之九十的可能 xff1a 你的密码错了 xff01 你需要注意的是 xff0c 我们的实例有两个
  • 为什么使用token?session与token的区别

    目录 一 session的状态保持及弊端 二 token认证机制 一 session的状态保持及弊端 当用户第一次通过浏览器使用用户名和密码访问服务器时 xff0c 服务器会验证用户数据 xff0c 验证成功后在服务器端写入session数
  • 在线加密解密工具

    http tool oschina net encrypt 一个在线加解密工具 xff0c 界面如图 xff1a
  • Django到底是MVC还是MVT?以及MVC和MVT的区别

    最近一直被一些问题所困惑 xff1a Django是遵循MVC还是MVT xff1f MVC和MVT到底有哪些区别 xff1f MVC可以继续拆分吗 xff1f 在网络上浏览了很多无关痛痒的文章 xff0c 无非是M V C分别代表什么 x
  • 【Python】使用Counter方法统计字符串每个字符出现的次数

    from collections import Counter a 61 34 a lskdh 96 foiegn 96 96 as ldnf asd 121 2ljladsfkja 96 sdijfhaosjlfd gjsdfg as d
  • 【Python】时间戳的格式化输出

    将当前时间按照 2019 02 25 10 xff1a 26 xff1a 55 输出 xff1a import datetime now time 61 datetime datetime now strftime 34 Y m d H M
  • 【Python】输出给定范围内的所有素数

    质数 xff08 prime number xff09 又称素数 xff0c 有无限个 质数定义为在大于1的自然数中 xff0c 除了1和它本身以外不再有其他因数 首先定义一个空列表用来存放所有的素数 sushu 61 遍历给定的范围 xf
  • Java 通过map构造树形结构

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