当前位置: 首页 > 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
    }
]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go语言--传输文件
  • ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库
  • 修BUG:程序包javax.servlet.http不存在
  • 算法学习day12(动态规划)
  • LabVIEW前面板占满整个屏幕(转)
  • 【操作系统】文件管理——文件管理基础、文件的逻辑结构和目录结构(个人笔记)
  • 高级Puppet manifest编写和模块化管理:构建高效可靠的自动化运维平台
  • Python实现一对多WebSocket发送给指定多个客户端
  • Window10下安装WSL-Ubuntu20.04
  • 找到并留住最佳员工
  • 掌握异常处理的艺术:LangChain中的错误与异常管理策略
  • 深度学习-2-TensorFlow和PyTorch深度学习框架的选择
  • Qt常用快捷键
  • 云计算【第一阶段(29)】远程访问及控制
  • OpenCV 寻找棋盘格角点及绘制
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【5+】跨webview多页面 触发事件(二)
  • Druid 在有赞的实践
  • Gradle 5.0 正式版发布
  • Java编程基础24——递归练习
  • LeetCode18.四数之和 JavaScript
  • vue 个人积累(使用工具,组件)
  • 阿里云Kubernetes容器服务上体验Knative
  • 搭建gitbook 和 访问权限认证
  • 分享一份非常强势的Android面试题
  • 基于组件的设计工作流与界面抽象
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 为视图添加丝滑的水波纹
  • 找一份好的前端工作,起点很重要
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • kubernetes资源对象--ingress
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #数据结构 笔记一
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (接口封装)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (原)Matlab的svmtrain和svmclassify
  • (转)jQuery 基础
  • (转)用.Net的File控件上传文件的解决方案
  • (自用)仿写程序
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .a文件和.so文件
  • .net core 6 redis操作类
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net6使用WebSocket与前端进行通信
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .Net中的集合
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现