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

http://www.lryc.cn/news/397159.html

相关文章:

  • 探索AI数字人的开源解决方案
  • 科普文:深入理解负载均衡(四层负载均衡、七层负载均衡)
  • 华为模拟器ensp中USG6000V防火墙web界面使用
  • 使用Python绘制气泡图
  • 政安晨:【Keras机器学习示例演绎】(五十四)—— 使用神经决策森林进行分类
  • 洞察消费者心理:Transformer模型在消费者行为分析的创新应用
  • 如何安全使用代理ip
  • 机器学习——LR、‌GBDT、‌SVM、‌CNN、‌DNN、‌RNN、‌Word2Vec等模型的原理和应用
  • 揭秘SQL Server数据库选项:性能与行为的调控者
  • 【排序 - 选择排序优化版(利用堆排序)】
  • PHP编程开发工具有哪些?
  • 火柴棒图python绘画
  • Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇
  • Effective C++笔记之二十一:One Definition Rule(ODR)
  • 探索未来:Transformer模型在智能环境监测的革命性应用
  • Nginx中文URL请求404
  • 33. 动量法(Momentum)介绍
  • Python | Leetcode Python题解之第228题汇总区间
  • 物联网应用,了解一点 WWAN全球网络标准
  • 如何指定多块GPU卡进行训练-数据并行
  • RK3568笔记三十三: helloworld 驱动测试
  • 【智能制造-14】机器视觉软件
  • MVC分页
  • webGL可用的14种3D文件格式,但要具体问题具体分析。
  • HybridCLR原理中的重点总结
  • 昇思学习打卡-14-ResNet50迁移学习
  • 软件开发面试题C#,.NET知识点(续)
  • 2019年美赛题目Problem A: Game of Ecology
  • 沙龙回顾|MongoDB如何充当企业开发加速器?
  • 云端编码:将您的技术API文档安全存储在iCloud的最佳实践