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進行判空決定是否再去查詢子菜單

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM