zoukankan      html  css  js  c++  java
  • java代码递归(多级菜单递归遍历成树)

    转载地址:https://blog.csdn.net/qq_36421955/article/details/80846044?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4

    1.菜单类:

     1 public class Menu {
     2     // 菜单id
     3     private String id;
     4     // 菜单名称
     5     private String name;
     6     // 父菜单id
     7     private String parentId;
     8     // 菜单url
     9     private String url;
    10     // 菜单图标
    11     private String icon;
    12     // 菜单顺序
    13     private int order;
    14     // 子菜单
    15     private List<Menu> childMenus;
    16     // ... 省去getter和setter方法以及toString方法
    17 
    18 }

    2.递归主题方法:

     1 /**
     2      * 模块名称
     3      */
     4     public Map<String,Object> testQueryMenuList() {
     5         // 原始的数据
     6        List<Menu> rootMenu = menuDao.queryMenuList(null);
     7         // 查看结果
     8        for (Menu menu : rootMenu) {
     9            System.out.println(menu);
    10        }
    11         // 最后的结果
    12        List<Menu> menuList = new ArrayList<Menu>();
    13         // 先找到所有的一级菜单
    14        for (int i = 0; i < rootMenu.size(); i++) {
    15             // 一级菜单没有parentId
    16            if (StringUtils.isBlank(rootMenu.get(i).getParentId())) {
    17                menuList.add(rootMenu.get(i));
    18            }
    19        }
    20         // 为一级菜单设置子菜单,getChild是递归调用的
    21        for (Menu menu : menuList) {
    22            menu.setChildMenus(getChild(menu.getId(), rootMenu));
    23        }
    24        Map<String, Object> jsonMap = new HashMap<>();
    25        jsonMap.put("menu", menuList);
    26        //System.out.println(gson.toJson(jsonMap));//使用gson需要在pom.xml引入gson依赖见 2.1步骤
    27        //return gson.toJson(jsonMap);//返回类型为String
    28         return  jsonMap;
    29     }
    30 
    31     /**
    32      * 子方法
    33      **/
    34     private List<Menu> getChild(String id, List<Menu> rootMenu) {
    35         // 子菜单
    36        List<Menu> childList = new ArrayList<>();
    37        for (Menu menu : rootMenu) {
    38             // 遍历所有节点,将父菜单id与传过来的id比较
    39            if (StringUtils.isNotBlank(menu.getParentId())) {
    40                if (menu.getParentId().equals(id)) {
    41                    childList.add(menu);
    42                }
    43            }
    44        }
    45         // 把子菜单的子菜单再循环一遍
    46        for (Menu menu : childList) {// 没有url子菜单还有子菜单
    47     //该节点不含子节点 具体见2.2解释
    48             if (StringUtils.isBlank(menu.getUrl())) {
    49                 // 递归
    50                menu.setChildMenus(getChild(menu.getId(), rootMenu));
    51            }
    52        } // 递归退出条件
    53        if (childList.size() == 0) {
    54            return null;
    55        }
    56        return childList;
    57     }
    58     

     2.1.引入依赖pom.xml

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.8</version>
    </dependency>

    2.2  StringUtils.isBlank(menu.getUrl())

    这里根据需求可做改动,我这里如果一个菜单有子菜单的话该菜单是没有url的,子菜单才有具体的url跳转,父菜单不用绑定url点击后只展示子菜单并不进行请求接口,
    所以没有url的菜单肯定是有子菜单的,有了url的菜单肯定是最终级别分支的菜单,所以对url进行判空决定是否再去查询子菜单
  • 相关阅读:
    HDU 1019 Least Common Multiple GCD
    HDU 1263 水果 结构体排序
    HDU 1256 画8 模拟题
    HDU 2058 The sum problem 数学题
    VC6.0开发OCX按钮控件
    利用压缩软件制作插件安装包
    vs生成的exe程序和相关dll打包
    vs2010开发activex(MFC)控件/ie插件(一)
    vs2010开发activex(MFC)控件/ie插件(二):js传参数
    vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
  • 原文地址:https://www.cnblogs.com/lidar/p/12972792.html
Copyright © 2011-2022 走看看