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

树形递归模板

详情参考CSDN链接: https://www.cnblogs.com/lidar/p/12972792.html

public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标private String icon;// 菜单顺序private int order;// 子菜单private List<Menu> childMenus;// ... 省去getter和setter方法以及toString方法}----------------------------------------------------------------------
/*** 模块名称*/public Map<String,Object> testQueryMenuList() {// 原始的数据List<Menu> rootMenu = menuDao.queryMenuList(null);// 查看结果for (Menu menu : rootMenu) {System.out.println(menu);}// 最后的结果List<Menu> menuList = new ArrayList<Menu>();// 先找到所有的一级菜单for (int i = 0; i < rootMenu.size(); i++) {// 一级菜单没有parentIdif (StringUtils.isBlank(rootMenu.get(i).getParentId())) {menuList.add(rootMenu.get(i));}}// 为一级菜单设置子菜单,getChild是递归调用的for (Menu menu : menuList) {menu.setChildMenus(getChild(menu.getId(), rootMenu));}Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("menu", menuList);//System.out.println(gson.toJson(jsonMap));//使用gson需要在pom.xml引入gson依赖见 2.1步骤//return gson.toJson(jsonMap);//返回类型为Stringreturn  jsonMap;}/*** 子方法**/private List<Menu> getChild(String id, List<Menu> rootMenu) {// 子菜单List<Menu> childList = new ArrayList<>();for (Menu menu : rootMenu) {// 遍历所有节点,将父菜单id与传过来的id比较if (StringUtils.isNotBlank(menu.getParentId())) {if (menu.getParentId().equals(id)) {childList.add(menu);}}}// 把子菜单的子菜单再循环一遍for (Menu menu : childList) {// 没有url子菜单还有子菜单//该节点不含子节点 具体见2.2解释if (StringUtils.isBlank(menu.getUrl())) {// 递归menu.setChildMenus(getChild(menu.getId(), rootMenu));}} // 递归退出条件if (childList.size() == 0) {return null;}return childList;}

//依赖

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.2.8</version>
</dependency>

相关文章:

  • 面试算法-88-反转链表
  • 【软件测试_黑白盒测试】白盒测试黑盒测试 区别
  • window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)
  • [Repo Git] manifests的写法
  • 【LLM多模态】Cogvlm图生文模型结构和训练流程
  • mysql的实训操作任务指南
  • 2024.3.9|第十五届蓝桥杯模拟赛(第三期)
  • java 实现发送邮件功能
  • YoloV8改进策略:BackBone改进|PKINet
  • 基于SpringBoot的高校办公室行政事务管理系统
  • 【C++】关联式容器——map和set
  • mysql80-DBA数据库学习1
  • C++入门:类和对象(上)
  • 车辆信息查询API:高效获取车牌号对应车辆的实时信息
  • 从0写一个问卷调查APP的第13天-1
  • [LeetCode] Wiggle Sort
  • C# 免费离线人脸识别 2.0 Demo
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • fetch 从初识到应用
  • HashMap ConcurrentHashMap
  • HTTP请求重发
  • IP路由与转发
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 基础知识 - 入门篇(一)
  • java中的hashCode
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • redis学习笔记(三):列表、集合、有序集合
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 基于HAProxy的高性能缓存服务器nuster
  • 记录一下第一次使用npm
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​VRRP 虚拟路由冗余协议(华为)
  • #include
  • #stm32驱动外设模块总结w5500模块
  • #大学#套接字
  • (1)bark-ml
  • (2020)Java后端开发----(面试题和笔试题)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (八)c52学习之旅-中断实验
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .“空心村”成因分析及解决对策122344
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net 知识杂记
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET上SQLite的连接
  • .NET实现之(自动更新)
  • @NestedConfigurationProperty 注解用法
  • [ IO.File ] FileSystemWatcher
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解