菜单树生成工具类

这个Java代码示例展示了如何使用递归方法将菜单列表转换为树形结构,适用于具有层级关系的菜单数据。它包含两个递归方法,分别处理不同情况的菜单列表。通过创建和设置子菜单节点,最终生成一个层次清晰的菜单树。
摘要由CSDN通过智能技术生成
package com.common.util;

import cn.hutool.json.JSONUtil;
import com.domain.vo.MenuVo;

import java.util.ArrayList;
import java.util.List;

/**
 * 菜单递归工具类
 * 悦享梦想
 * 2021-07-02
 */
public class MenuTreeUtil {

    public static List<MenuVo> getMenuTree(List<MenuVo> menuList, String rootId) {
        List<MenuVo> list = groupMenuList(menuList, rootId);
        return list;
    }

    //根据id和pId进行递归,此时适合list最顶级菜单的id和parentId相等的情况
    private static List<MenuVo> groupMenuList(List<MenuVo> menuList, String pId) {
        List<MenuVo> iteratorMenuList = new ArrayList<>();
        for (MenuVo m : menuList) {
            if("0".equals(pId)){
                if (m.getParentId().equals(m.getId())) {
                    List<MenuVo> childMenuList = groupMenuList(menuList, m.getId());
                    m.setChildren(childMenuList);
                    iteratorMenuList.add(m);
                }
            }else{
                if (m.getParentId().equals(pId) && !m.getParentId().equals(m.getId())) {
                    List<MenuVo> childMenuList = groupMenuList(menuList, m.getId());
                    m.setChildren(childMenuList);
                    iteratorMenuList.add(m);
                }
            }
        }
        return iteratorMenuList;
    }

    //根据id和pId进行递归,此时适合list的最顶级菜单父ID都为0的情况
    private static List<MenuVo> groupMenuList(String pId, List<MenuVo> list) {
        List<MenuVo> iteratorMenuList = new ArrayList<>();
        for (MenuVo m : list) {
            if (m.getParentId().equals(pId)) {
                List<MenuVo> childMenuList = groupMenuList(m.getId(), list);
                m.setChildren(childMenuList);
                iteratorMenuList.add(m);
            }
        }
        return iteratorMenuList;
    }

    public static void main(String[] args) {
        //构造三栋济南有1个子节点嵌套JSON
        MenuVo msd=new MenuVo();
        msd.setId("1111");
        msd.setTitle("广东省");
        msd.setParentId("1111");

        MenuVo jnd=new MenuVo();
        jnd.setId("2222");
        jnd.setTitle("深圳市");
        jnd.setParentId("1111");

        MenuVo qdd=new MenuVo();
        qdd.setId("3333");
        qdd.setTitle("东莞市");
        qdd.setParentId("1111");

        MenuVo s1nd=new MenuVo();
        s1nd.setId("4444");
        s1nd.setTitle("南山区");
        s1nd.setParentId("2222");

        MenuVo s2dd=new MenuVo();
        s2dd.setId("5555");
        s2dd.setTitle("南城区");
        s2dd.setParentId("3333");

        List<MenuVo> menuVoList = new ArrayList<>();
        menuVoList.add(msd);
        menuVoList.add(jnd);
        menuVoList.add(qdd);
        menuVoList.add(s1nd);
        menuVoList.add(s2dd);

        //取层级关系
        List<MenuVo> treeList=getMenuTree(menuVoList,"0");
        System.out.println(JSONUtil.toJsonStr(treeList));
    }

}

例子运行结果:

[
    {
        "title":"广东省",
        "parentId":"1111",
        "children":[
            {
                "title":"深圳市",
                "parentId":"1111",
                "children":[
                    {
                        "title":"南山区",
                        "parentId":"2222",
                        "children":[

                        ],
                        "id":"4444"
                    }
                ],
                "id":"2222"
            },
            {
                "title":"东莞市",
                "parentId":"1111",
                "children":[
                    {
                        "title":"南城区",
                        "parentId":"3333",
                        "children":[

                        ],
                        "id":"5555"
                    }
                ],
                "id":"3333"
            }
        ],
        "id":"1111"
    }
]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值