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菜单树递归的主要内容,如果未能解决你的问题,请参考以下文章

java从数据库读取菜单,递归生成菜单树

递归添加子树以提升属性树

递归添加子树以提升属性树

二叉树遍历的非递归

二叉树,B树,B+树,红黑树 简介

根据Prolog中公共子树的数量,树之间的递归相似度