当前位置: 首页 > news >正文

树形结构的一种便捷实现方案

背景

在开发过程中经常需要把平铺的数据结构转为树形的数据结构,例如多级菜单、组织机构等。

实现方案有很多种。

1、可以使用递归查询,但是这样数据一多会导致频繁的多次查询数据库,产生很多额外的IO开销,总体的响应时间会比较慢,一般不会这样做。

2、可以事先查询出来所有的数据,再进行递归的子节点查找,这是一个可行的方案,只需要查询一次数据库,之后的操作利用算法在内存操作,这样响应时间会有一个很大的提升。

3、这里要说的一种方案和第二种类似,只不过采用了google的guava包下的Multimap这种数据结构,利用它可以一个key对应多个值的特性。

方案实现

引入guava包

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.2.0-jre</version>
</dependency><!-- 这个包可以不要,这里我用来转json字符串打印出来有用到 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>

树形VO

@Data
public class TreeVO {private List<TreeVO> children;private int id;private boolean leaf;private String menuName;private int parentId;
}

转树示例代码

public static void main(String[] args) {TreeVO v1 = new TreeVO();v1.setId(10L);v1.setParentId(0L);v1.setMenuName("第一级菜单");TreeVO  v2 = new TreeVO();v2.setId(11L);v2.setParentId(10L);v2.setMenuName("第二级菜单1");TreeVO v21 = new TreeVO();v21.setId(12L);v21.setParentId(10L);v21.setMenuName("第二级菜单2");TreeVO v3 = new TreeVO();v3.setId(21L);v3.setParentId(11L);v3.setMenuName("第三级菜单");Multimap<Long,TreeVO> multimap = ArrayListMultimap.create();multimap.put(v1.getParentId(),v1);multimap.put(v2.getParentId(),v2);multimap.put(v21.getParentId(),v21);multimap.put(v3.getParentId(),v3);Iterator<TreeVO> iterator = multimap.values().iterator();while (iterator.hasNext()) {TreeVOmenuNode = iterator.next();// 找直接后代 childrenCollection<TreeVO> children = multimap.get(menuNode.getId());if (children.isEmpty()) {menuNode.setLeaf(true);menuNode.setChildren(null);} else {menuNode.setChildren(children);}}System.out.println(JSON.toJSONString(multimap.get(0L),SerializerFeature.PrettyFormat));}

这里打印出来的结果是

[
    {
        "children":[
            {
                "children":[
                    {
                        "id":21,
                        "leaf":true,
                        "menuName":"第三级菜单",
                        "parentId":11
                    }
                ],
                "id":11,
                "leaf":false,
                "menuName":"第二级菜单1",
                "parentId":10
            },
            {
                "id":12,
                "leaf":true,
                "menuName":"第二级菜单2",
                "parentId":10
            }
        ],
        "id":10,
        "leaf":false,
        "menuName":"第一级菜单",
        "parentId":0
    }
]

相关文章:

树形结构的一种便捷实现方案

背景 在开发过程中经常需要把平铺的数据结构转为树形的数据结构&#xff0c;例如多级菜单、组织机构等。 实现方案有很多种。 1、可以使用递归查询&#xff0c;但是这样数据一多会导致频繁的多次查询数据库&#xff0c;产生很多额外的IO开销&#xff0c;总体的响应时间会比较…...

探索AI数字人的开源解决方案

引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI数字人&#xff08;或虚拟人&#xff09;正逐渐走进我们的生活&#xff0c;从虚拟助手到虚拟主播&#xff0c;再到虚拟客服&#xff0c;AI数字人在各个领域展现出巨大的潜力。开源解决方案的出现&…...

科普文:深入理解负载均衡(四层负载均衡、七层负载均衡)

概叙 网络模型&#xff1a;OSI七层模型、TCP/IP四层模型、现实的五层模型 应用层&#xff1a;对软件提供接口以使程序能使用网络服务&#xff0c;如事务处理程序、文件传送协议和网络管理等。&#xff08;HTTP、Telnet、FTP、SMTP&#xff09; 表示层&#xff1a;程序和网络之…...

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…...

使用Python绘制气泡图

使用Python绘制气泡图 气泡图效果代码 气泡图 气泡图通过气泡的大小表示数据的一个维度&#xff0c;用于展示三个维度的数据。例如&#xff0c;可以展示城市的人口、面积和GDP。 效果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mjj27sP7-1720…...

政安晨:【Keras机器学习示例演绎】(五十四)—— 使用神经决策森林进行分类

目录 导言 数据集 设置 准备数据 定义数据集元数据 为训练和验证创建 tf_data.Dataset 对象 创建模型输入 输入特征编码 深度神经决策树 深度神经决策森林 实验 1&#xff1a;训练决策树模型 实验 2&#xff1a;训练森林模型 政安晨的个人主页&#xff1a;政安晨 欢…...

洞察消费者心理:Transformer模型在消费者行为分析的创新应用

洞察消费者心理&#xff1a;Transformer模型在消费者行为分析的创新应用 在数字化时代&#xff0c;消费者行为分析对于企业理解市场动态、制定营销策略至关重要。Transformer模型&#xff0c;以其在处理序列数据方面的优势&#xff0c;为消费者行为分析提供了新的视角和工具。…...

如何安全使用代理ip

1、选择可靠的代理服务提供商&#xff1a;选择知名的、信誉良好的代理服务提供商&#xff0c;避免使用免费的代理服务&#xff0c;因为免费的代理服务可能存在安全隐患。 2、使用HTTPS代理&#xff1a;使用HTTPS代理可以加密你的网络流量&#xff0c;保护你的隐私和安全。 3、…...

机器学习——LR、‌GBDT、‌SVM、‌CNN、‌DNN、‌RNN、‌Word2Vec等模型的原理和应用

LR&#xff08;逻辑回归&#xff09; 原理&#xff1a; 逻辑回归模型&#xff08;Logistic Regression, LR&#xff09;是一种广泛应用于分类问题的统计方法&#xff0c;尤其适用于二分类问题。其核心思想是通过Sigmoid函数将线性回归模型的输出映射到(0,1)区间&#xff0c;从…...

揭秘SQL Server数据库选项:性能与行为的调控者

揭秘SQL Server数据库选项&#xff1a;性能与行为的调控者 在SQL Server的世界中&#xff0c;数据库选项是那些可以调整以优化数据库性能和行为的设置。它们是数据库管理员和开发者的得力助手&#xff0c;通过精细调控&#xff0c;可以显著提升数据库的响应速度和资源利用率。…...

【排序 - 选择排序优化版(利用堆排序)】

结合选择排序和堆排序的思路&#xff0c;可以通过利用堆数据结构来优化选择排序的过程&#xff0c;使得排序算法更加高效。在这种结合中&#xff0c;我们利用堆的特性来快速定位和选择未排序部分的最小元素&#xff0c;避免了选择排序中每次线性搜索的开销。 选择排序和堆排序…...

PHP编程开发工具有哪些?

PHP的开发工具种类繁多&#xff0c;涵盖了从集成开发环境&#xff08;IDE&#xff09;、代码编辑器、调试器到版本控制工具和数据库管理工具等多个方面。以下是一些常见的PHP开发工具&#xff1a; 1. 集成开发环境&#xff08;IDE&#xff09; PhpStorm&#xff1a;由JetBrai…...

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数&#xff08;PMF&#xff09; 在这篇博客中&#xff0c;我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数&#xff08;PMF&#xff09;。二项分布是统计学中常见的离散概率分布&#xff0c;描述了在固定次…...

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…...

Effective C++笔记之二十一:One Definition Rule(ODR)

ODR细节有点复杂&#xff0c;跨越各种情况。基本内容如下&#xff1a; ●普通&#xff08;非模板&#xff09;的noninline函数和成员函数、noninline全局变量、静态数据成员在整个程序中都应当只定义一次。 ●class类型&#xff08;包括structs和unions&#xff09;、模板&…...

探索未来:Transformer模型在智能环境监测的革命性应用

探索未来&#xff1a;Transformer模型在智能环境监测的革命性应用 在当今数字化时代&#xff0c;环境监测正逐渐从传统的人工检测方式转变为智能化、自动化的系统。Transformer模型&#xff0c;作为深度学习领域的一颗新星&#xff0c;其在自然语言处理&#xff08;NLP&#x…...

Nginx中文URL请求404

这两天正在搞我的静态网站。方案是&#xff1a;从思源笔记Markdown笔记&#xff0c;用MkOcs build成静态网站&#xff0c;上传到到Nginx服务器。遇到一个问题&#xff1a;URL含有中文会404&#xff0c;全英文URL则正常访问。 ‍ 比如&#xff1a; ​​ ‍ 设置了utf-8 ht…...

33. 动量法(Momentum)介绍

1. 背景知识 在深度学习的优化过程中&#xff0c;梯度下降法&#xff08;Gradient Descent, GD&#xff09;是最基本的方法。然而&#xff0c;基本的梯度下降法在实际应用中存在收敛速度慢、容易陷入局部最小值以及在高维空间中振荡较大的问题。为了解决这些问题&#xff0c;人…...

Python | Leetcode Python题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; class Solution:def summaryRanges(self, nums: List[int]) -> List[str]:def f(i: int, j: int) -> str:return str(nums[i]) if i j else f{nums[i]}->{nums[j]}i 0n len(nums)ans []while i < n:j iwhile j 1 < n …...

物联网应用,了解一点 WWAN全球网络标准

WWAN/蜂窝无线电认证&#xff0c;对跨地区应用场景&#xff0c;特别重要。跟随全球业务的脚步&#xff0c;我们像大唐先辈一样走遍全球业务的时候&#xff0c;了解一点全球化的 知识信息&#xff0c;就显得有那么点意义。 NA &#xff08;北美&#xff09;&#xff1a;美国和加…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...