Java菜单树递归
Posted java李杨勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java菜单树递归相关的知识,希望对你有一定的参考价值。
主要实现思路
1.首先从菜单数据中获取所有根节点。
2.为根节点建立次级子树并拼接上。
3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。
数据表设计:
CREATE TABLE `menu` (
`id` bigint(20) unsigned NOT NULL COMMENT '主键',
`name` varchar(11) NOT NULL COMMENT '名称',
`sort_no` smallint(5) unsigned NOT NULL DEFAULT '10' COMMENT '排序号',
`parent_id` bigint(20) unsigned NOT NULL COMMENT '父节点id',
`icon` varchar(200) DEFAULT NULL COMMENT '图标',
`remark` varchar(20) DEFAULT NULL COMMENT '备注',
`url` varchar(60) DEFAULT NULL COMMENT '菜单链接',
`level` tinyint(4) DEFAULT NULL COMMENT '菜单等级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';
递归获取下级菜单:
/**
* 递归获取下级菜单
* @param pid
* @param menus 所有菜单
* @return
*/
public List<Menu> getChild(Long pid, List<Menu> menus)
//子菜单列表
List<Menu> childList = new ArrayList<>();
for (Menu menu : menus)
if (pid.equals(menu.getParentId()))
childList.add(menu);
//遍历 获取子菜单的子菜单
for (Menu menu : childList)
List<Menu> child = getChild(menu.getId(), menus);
menu.setChildren(child);
//递归出口 childList长度为0
if (childList.size() == 0)
return new ArrayList<>();
return childList;
根据用户角色获取菜单对象集合信息、目前拿管理员举例
/**
* 根据角色id获取对象集合信息
*/
public List<Menu> getAllMenus()
List<Menu> menus = this.loadAll();
//返回的菜单树
List<Menu> rootMenus = new ArrayList<>();
for (Menu menu : menus)
//pid(上级Id)为0的是根菜单
if (0==(menu.getParentId()))
rootMenus.add(menu);
//遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
for (Menu rootMenu : rootMenus)
List<Menu> child = getChild(rootMenu.getId(), menus);
rootMenu.setChildren(child);
return rootMenus;
返回数据:
以上是关于Java菜单树递归的主要内容,如果未能解决你的问题,请参考以下文章