Java 递归获取菜单树

10 篇文章 0 订阅
10 篇文章 0 订阅

Java 递归获取菜单树

递归生成一个菜单树结构,整体思路如下所示:

  1. 编写两个类数据模型Menu和创建树形的MenuTree集合,用于存储菜单树数据。
  2. 编写递归程序,遍历每一个父节点下面的数据。
  3. 检查递归返回的数据合理性。

数据模型

数据模型Menu和创建树形的MenuTree集合,存储每一个节点下的菜单树!
具体代码如下所示:

public class Menu {
    private String id;// 菜单当前节点
    private String pid;// 菜单父节点
    private String menuName;// 菜单名字
    private List<Menu> subMenu;// 子菜单

    public Menu() {
    }
    public Menu(String id, String pid, String menuName) {
        this.id = id;
        this.pid = pid;
        this.menuName = menuName;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }

    public List<Menu> getSubMenu() {
        return subMenu;
    }

    public void setSubMenu(List<Menu> subMenu) {
        this.subMenu = subMenu;
    }
}

递归程序

递归获取菜单树整体思路如下所示:

  1. 获取菜单范围内搜索。
  2. 获取最上级菜单的数据。
  3. 获取上级菜单的全部子菜单。
  4. 通过获取的当前菜单的子菜单的数据,通过当前子菜单的数据再获取当前子菜单下的子菜单数据,直到无子菜单数据即可退出递归。

通过上述思路,具体代码实现如下!

最上级菜单数据

   /**
     * 获取最上级菜单与最上级菜单下的子菜单数据
     * @return
     */
    public static List<Menu> findTreeMenu(){
        List<Menu> menus = findAllMenu();  //获取菜单范围内数据。
        List<Menu> rootMenus = new ArrayList<>();
        for (Menu menu : menus) {
            //从最上级菜单开始展示
            if(menu.getPid() == null){
                rootMenus.add(menu);
            }
        }
        for (Menu rootMenu : rootMenus) {
            //把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到
            List<Menu> child = getChild(rootMenu.getId(), menus);
            rootMenu.setSubMenu(child);
        }
        return rootMenus;
    }

最下级菜单数据

   /**
     *通过传入当前菜单id,获取当前菜单id的子菜单 且子菜单里也有子菜单的数据,直到无子菜单数据即可退出递归
     * @param id  当前菜单的id
     * @param menus  要查询的菜单范围
     * @return  该id的子菜单
     */
    private static List<Menu> getChild(String id, List<Menu> menus){
        List<Menu> childList = new ArrayList<>();
        for (Menu menu : menus) {
            if(id.equals(menu.getPid())){
                //获取当前菜单id的所有子列表
                childList.add(menu);
            }
        }
        for (Menu menu : childList) {
            //将该id的子菜单进行遍历,通过递归调用,获取每一个子菜单的子菜单数据
            List<Menu> child = getChild(menu.getId(), menus);
            menu.setSubMenu(child);
        }
        if(childList.size()==0){
            //子菜单的长度为0,返回null,null不会被阿里的FastJson包解析
            return  null;
        }
        return  childList;
    }

检测菜单树

使用谷歌的Gson

POM文件

引入所需要解析的Pom文件,如下所示:

<!-- 使用谷歌的Gson -->
<dependency>
     <groupId>com.google.code.gson</groupId>
     <artifactId>gson</artifactId>
     <version>2.2.4</version>
 </dependency>
解析操作
List<Menu> treeMenu = findTreeMenu();
Gson gson = new Gson();
String s1 = gson.toJson(treeMenu);
System.out.println("使用谷歌的Gson:"+s1);

具体解析返回值:

使用谷歌的Gson[{"id":"0","menuName":"小麦系统管理","subMenu":[{"id":"1","pid":"0","menuName":"首页"},{"id":"2","pid":"0","menuName":"用户管理","subMenu":[{"id":"21","pid":"2","menuName":"用户增加"},{"id":"22","pid":"2","menuName":"用户修改"},{"id":"23","pid":"2","menuName":"用户删除","subMenu":[{"id":"231","pid":"23","menuName":"用户恢复","subMenu":[{"id":"2311","pid":"231","menuName":"用户恢复-load"}]}]}]},{"id":"3","pid":"0","menuName":"菜单管理","subMenu":[{"id":"31","pid":"3","menuName":"菜单增加"}]}]}]

主要区别是:
在这里插入图片描述

使用阿里的FastJson

POM文件

引入所需要解析的Pom文件,如下所示:

<!-- 使用阿里的FastJson -->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>2.0.1</version>
</dependency>
解析操作
List<Menu> treeMenu = findTreeMenu();
String s = JSON.toJSONString(treeMenu, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
        SerializerFeature.WriteDateUseDateFormat);
System.out.println("使用阿里的FastJson:"+s);

具体解析返回值:

使用阿里的FastJson[{"id":"0","menuName":"小麦系统管理","pid":null,"subMenu":[{"id":"1","menuName":"首页","pid":"0","subMenu":null},{"id":"2","menuName":"用户管理","pid":"0","subMenu":[{"id":"21","menuName":"用户增加","pid":"2","subMenu":null},{"id":"22","menuName":"用户修改","pid":"2","subMenu":null},{"id":"23","menuName":"用户删除","pid":"2","subMenu":[{"id":"231","menuName":"用户恢复","pid":"23","subMenu":[{"id":"2311","menuName":"用户恢复-load","pid":"231","subMenu":null}]}]}]},{"id":"3","menuName":"菜单管理","pid":"0","subMenu":[{"id":"31","menuName":"菜单增加","pid":"3","subMenu":null}]}]}]

主要区别是:
在这里插入图片描述以上就是菜单树的生成以及俩种Json的解析区别!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胤墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值