一、树形结构简介

首先构建树形结构,我们得知道什么是树形结构,如下图所示。

如上图所示,可以看出有四级菜单,这就是树形结构。

如果想更深入的了解树形结构,建议去查询数据结构中关于树的章节。

二、树形菜单的分析与制作

至此,我们开始正式分析树形菜单的制作。

首先制作树形菜单我们需要用到两个类,一个菜单实体(Menu),一个生成树形的工具类(MenuTree)。

分析:菜单实体(Menu),承载菜单信息

生成树形的工具类(MenuTree),三个方法,获取根节点,获取子树,生成树。

获取根节点:获取所有上级菜单ID是0,放在根节点集合中

获取子树:传入根节点,通过递归调用不停查找下级菜单是否还有下级,没有就将制作的菜单列表加入该根节点的children中

生成树:先调用获取根节点得到根节点集合,再遍历根节点集合,对每一个根节点获取子菜单

关于两个类的作用具体参见下面源码,我都有给注释,应该是蛮好理解的。

菜单实体

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "菜单实体")
public class Menu {@ApiModelProperty("菜单ID")private String id;@ApiModelProperty("菜单名称")private String name;@ApiModelProperty("上级菜单ID")private String pId;@ApiModelProperty("下级菜单集合")private List<Menu> children;
}

生成菜单列表工具类

public class MenuTree {// 流程:数据库查出的菜单记录装载在承载菜单的列表中---//         构建树(获取根节点,遍历根节点,对每一个根节点构建子树)---得到最终树形菜单// 承载菜单的列表private List<Menu> menuList = new ArrayList<>();// 带参构造器,将数据库中的菜单数据记录,装载在我们承载菜单的列表中public MenuTree(List<Menu> menuList){this.menuList = menuList;}// 获取根节点public List<Menu> getRootNode(){List<Menu> rootNode = new ArrayList<>();for (Menu menu : menuList) {if (menu.getPId().equals("0")){rootNode.add(menu);}}return rootNode;}// 构建子树public Menu buildChildren(Menu rootNode){List<Menu> childrenTree = new ArrayList<>();for (Menu menu : menuList) {if (menu.getPId().equals(rootNode.getId())){childrenTree.add(buildChildren(menu));}}rootNode.setChildren(childrenTree);return rootNode;}// 构建树public List<Menu> buildTree(){List<Menu> menus = getRootNode();for (Menu menu : menus) {buildChildren(menu);}return menus;}
}

至此,属性菜单制作完毕,我们准备一些测试数据测试一下,是否成功!

三、树形菜单制作的测试

public class Test {public static void main(String[] args) {// ----------------------测试的菜单数据--------------------------ArrayList<Menu> menus = new ArrayList<>();menus.add(new Menu("1","一级","0",null));menus.add(new Menu("2","一级","0",null));menus.add(new Menu("3","一级","0",null));menus.add(new Menu("4","二级","1",null));menus.add(new Menu("5","二级","1",null));menus.add(new Menu("6","二级","2",null));menus.add(new Menu("7","三级","4",null));menus.add(new Menu("8","三级","5",null));menus.add(new Menu("9","三级","6",null));// ----------------------测试的菜单数据--------------------------// 以上数据实际应由数据库提供,本次测试写死// 创建生成树的工具类,调用构造树方法得到树形菜单List<Menu> menuList = new MenuTree(menus).buildTree();// fastjson的JSON  将java对象转为JSON字符串String jsonString = JSON.toJSONString(menuList);System.out.println(jsonString);}}
// 这是控制台打印的JSON数据[{"children":[{"children":[{"children":[],"id":"7","name":"三级","pId":"4"}],"id":"4","name":"二级","pId":"1"},{"children":[{"children":[],"id":"8","name":"三级","pId":"5"}],"id":"5","name":"二级","pId":"1"}],"id":"1","name":"一级","pId":"0"},{"children":[{"children":[{"children":[],"id":"9","name":"三级","pId":"6"}],"id":"6","name":"二级","pId":"2"}],"id":"2","name":"一级","pId":"0"},{"children":[],"id":"3","name":"一级","pId":"0"}]

我们将数据复制一下,去格式化一下,我用的是这个网站在线JSON校验格式化工具(Be JSON)

以下是格式化之后的数据,生成成功!!!

[{"children": [{"children": [{"children": [],"id": "7","name": "三级","pId": "4"}],"id": "4","name": "二级","pId": "1"}, {"children": [{"children": [],"id": "8","name": "三级","pId": "5"}],"id": "5","name": "二级","pId": "1"}],"id": "1","name": "一级","pId": "0"
}, {"children": [{"children": [{"children": [],"id": "9","name": "三级","pId": "6"}],"id": "6","name": "二级","pId": "2"}],"id": "2","name": "一级","pId": "0"
}, {"children": [],"id": "3","name": "一级","pId": "0"
}]

至此,我们的树形菜单分析与制作完毕,有不足之处望指出。

java构建树形菜单(多级菜单)相关推荐

  1. java构建树形结构

    目录 前言 实现树形结构 一.树节点数据类(反回参数类) 二.给树形结构添加数据 三.测试类 四.测试结果 前言 在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, ...

  2. java 构建树形结构_Java求助:如何建立一个树形结构

    在Java中如何实现一个如下的树形结构:root/|\year_2009year_2008year_2007,etc/|||month_1month_2month_1month_1|\|/\|day1 ...

  3. java递归实现多级菜单栏_Java构建树形菜单以及支持多级菜单的实例代码

    这篇文章主要介绍了Java构建树形菜单的实例代码(支持多级菜单),非常不错,具有参考借鉴价值,需要的朋友可以参考下 效果图:支持多级菜单. 菜单实体类: public class Menu { // ...

  4. STM32简易多级菜单(数组查表法)

    单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了. 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单 ...

  5. java树形菜单_Java构建树形菜单

    构建树形菜单 效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name ...

  6. mysql vue 菜谱_vue+ java 实现多级菜单递归效果

    效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一 ...

  7. java递归实现多级菜单栏_vue+ java 实现多级菜单递归效果

    效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一 ...

  8. java中菜单分几级_JAVA构造多级菜单

    很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...

  9. java实现多级菜单(java递归)方法二

    @Autowiredprivate TreeBuilder treeBuilder; /*** 获取树状结构数据*/@RequestMapping("menu/queryMenuTree&q ...

最新文章

  1. 在ASP.NET中自动给URL地址加上超链接
  2. go 调用etcd实现分布式锁
  3. ABAP性能优化之使用 “for all entries”
  4. day3 and homework
  5. MongoDB 聚合操作之$group使用
  6. JavaScript 异步执行的学习笔记 - 什么是事件循环 Event loop?
  7. python MySQL 插入Elasticsearch
  8. SPRING CLOUD服务网关之ZUUL
  9. 2020 年开发者生态报告:Python超越Java,Go、Kotlin强势崛起
  10. mysql 的命名管道_SQL Server中的命名管道(named pipe)及其使用
  11. 单片机片外程序存储器数据存储器操作命令
  12. MTK 驱动开发(15)---I2C
  13. Android中RelativeLayout及TableLayout使用说明
  14. python 爬虫生成csv文件和图_python爬虫系列(4.2-python操作csv文件)
  15. 一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法
  16. [4G5G专题-9]:前传接口 CPRI与OBSAI的那些事
  17. pdf转jpg的在线与用转换器的转换方法
  18. 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
  19. 1.点亮一个LED灯
  20. 英文打字自动空格如何解决?

热门文章

  1. linux安装tcping
  2. 企业级飞速低代码 | 这是一篇关于低代码平台的非完整推荐
  3. 前加绩中国、信雅达高级全栈工程师:吴劲松
  4. 基于Android驾校理论模拟考试系统APP
  5. flameshot 安装和卸载
  6. [Go菜牛系列]通过go-wrk进行HTTP接口压力测试
  7. 打开FSX,飞向远方!
  8. [转载] 中华典故故事(孙刚)——40 不见棺材不落泪,不到黄河不死心
  9. sqoop数据迁移工具
  10. 安装window虚拟打印机时出现无法启动Print Spooler服务,错误1068,依存服务或组无法启动