java构建树形菜单(多级菜单)
一、树形结构简介
首先构建树形结构,我们得知道什么是树形结构,如下图所示。
如上图所示,可以看出有四级菜单,这就是树形结构。
如果想更深入的了解树形结构,建议去查询数据结构中关于树的章节。
二、树形菜单的分析与制作
至此,我们开始正式分析树形菜单的制作。
首先制作树形菜单我们需要用到两个类,一个菜单实体(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构建树形菜单(多级菜单)相关推荐
- java构建树形结构
目录 前言 实现树形结构 一.树节点数据类(反回参数类) 二.给树形结构添加数据 三.测试类 四.测试结果 前言 在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, ...
- java 构建树形结构_Java求助:如何建立一个树形结构
在Java中如何实现一个如下的树形结构:root/|\year_2009year_2008year_2007,etc/|||month_1month_2month_1month_1|\|/\|day1 ...
- java递归实现多级菜单栏_Java构建树形菜单以及支持多级菜单的实例代码
这篇文章主要介绍了Java构建树形菜单的实例代码(支持多级菜单),非常不错,具有参考借鉴价值,需要的朋友可以参考下 效果图:支持多级菜单. 菜单实体类: public class Menu { // ...
- STM32简易多级菜单(数组查表法)
单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了. 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单 ...
- java树形菜单_Java构建树形菜单
构建树形菜单 效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name ...
- mysql vue 菜谱_vue+ java 实现多级菜单递归效果
效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一 ...
- java递归实现多级菜单栏_vue+ java 实现多级菜单递归效果
效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一 ...
- java中菜单分几级_JAVA构造多级菜单
很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...
- java实现多级菜单(java递归)方法二
@Autowiredprivate TreeBuilder treeBuilder; /*** 获取树状结构数据*/@RequestMapping("menu/queryMenuTree&q ...
最新文章
- 在ASP.NET中自动给URL地址加上超链接
- go 调用etcd实现分布式锁
- ABAP性能优化之使用 “for all entries”
- day3 and homework
- MongoDB 聚合操作之$group使用
- JavaScript 异步执行的学习笔记 - 什么是事件循环 Event loop?
- python MySQL 插入Elasticsearch
- SPRING CLOUD服务网关之ZUUL
- 2020 年开发者生态报告:Python超越Java,Go、Kotlin强势崛起
- mysql 的命名管道_SQL Server中的命名管道(named pipe)及其使用
- 单片机片外程序存储器数据存储器操作命令
- MTK 驱动开发(15)---I2C
- Android中RelativeLayout及TableLayout使用说明
- python 爬虫生成csv文件和图_python爬虫系列(4.2-python操作csv文件)
- 一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法
- [4G5G专题-9]:前传接口 CPRI与OBSAI的那些事
- pdf转jpg的在线与用转换器的转换方法
- 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
- 1.点亮一个LED灯
- 英文打字自动空格如何解决?