java实现多级菜单(递归)

菜单实体类:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Menu {

  // 菜单id

  private String id;

  // 菜单名称

  private String name;

  // 父菜单id

  private String parentId;

  // 菜单url

  private String url;

  // 菜单图标

  private String icon;

  // 菜单顺序

  private int order;

  // 子菜单

  private List<Menu> children;

  // ... 省去getter和setter方法以及toString方法

}

菜单一般需要排序,我们根据Menu的order字段进行排序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/*

  * 排序,根据order排序

  */

 public Comparator<Menu> order(){

   Comparator<Menu> comparator = new Comparator<Menu>() {

     @Override

     public int compare(Menu o1, Menu o2) {

       if(o1.getOrder() != o2.getOrder()){

         return o1.getOrder() - o2.getOrder();

       }

       return 0;

     }

   };

   return comparator;

 }

生成树的方法:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

public Map<String,Object> findTree(){

  Map<String,Object> data = new HashMap<String,Object>();

    try {//查询所有菜单

      List<Menu> allMenu = menuDao.findTree();

      //根节点

      List<Menu> rootMenu = new ArrayList<Menu>();

      for (Menu nav : allMenu) {

        if(nav.getParentId().equals("0")){//父节点是0的,为根节点。

          rootMenu.add(nav);

        }

      }

      /* 根据Menu类的order排序 */

      Collections.sort(rootMenu, order());

      //为根菜单设置子菜单,getClild是递归调用的

      for (Menu nav : rootMenu) {

        /* 获取根节点下的所有子节点 使用getChild方法*/

        List<Menu> childList = getChild(nav.getId(), allMenu);

        nav.setChildren(childList);//给根节点设置子节点

      }

      /**

       * 输出构建好的菜单数据。

       *

       */

      data.put("success""true");

      data.put("list", rootMenu);

      return data;

    catch (Exception e) {

      data.put("success""false");

      data.put("list"new ArrayList());

      return data;

    }

  }

获取子菜单:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

   * 获取子节点

   * @param id 父节点id

   * @param allMenu 所有菜单列表

   * @return 每个根节点下,所有子菜单列表

   */

  public List<Menu> getChild(String id,List<Menu> allMenu){

    //子菜单

    List<Menu> childList = new ArrayList<Menu>();

    for (Menu nav : allMenu) {

      // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较

      //相等说明:为该根节点的子节点。

      if(nav.ParentId().equals(id)){

        childList.add(nav);

      }

    }

    //递归

    for (Menu nav : childList) {

      nav.setChildren(getChild(nav.getId(), allMenu));

    }

    Collections.sort(childList,order());//排序

    //如果节点下没有子节点,返回一个空List(递归退出)

    if(childList.size() == 0){

      return new ArrayList<Menu>();

    }

    return childList;

  }

最后返回的JSON串如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

{

 "success""true",

 "list": [

   {

    "id""1",

    "name""Java",

    "parentid""0",

    "url""http://www.aliouchen.com",

    "order"1,

    "children": [

     {

       "id""2",

       "name""并发编程",

       "parentid""1",

       "url""http://www.aliouchen.com",

       "order"1,

       "children": []

     },

     {

       "id""3",

       "name""多线程",

       "parentid""1",

       "url""http://www.aliouchen.com",

       "order"2,

       "children": [

         "id""4",

         "name""Thread",

         "parentid""3",

         "url""http://www.aliouchen.com",

         "order"1,

          "children":[]

       ]

     }

    ]

   },

   {

    "id""5",

    "name""Python",

    "parentid""0",

    "url""http://www.aliouchen.com",

    "order"2,

    "children": []

   }

  ]

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值