树结构工具 - list数据转树形结构方法,无限制层级(实现树形菜单) - 自己编写的工具在此记录一下

List测试数据:

 转换后的数据格式:

@Data
//@ApiModel
public class Menu {

    //@ApiModelProperty(value = "资源id")
    private Integer id;

    //@ApiModelProperty(value = "资源名称")
    private String menuName;

    //@ApiModelProperty(value = "资源路径")
    private String urlPath;

    //@ApiModelProperty(value = "父资源Id")
    private Integer parent;

    /** 子菜单数据 */
    private List<Menu> children;

    public Menu(Integer id, String menuName, String urlPath, Integer parent) {
        this.id = id;
        this.menuName = menuName;
        this.urlPath = urlPath;
        this.parent = parent;
    }

}
public static void main(String[] args) {
        // 测试数据
        List<Menu> list = new ArrayList();
        list.add(new Menu(1, "用户管理", "/user/**", 0));
        list.add(new Menu(2, "新增用户", "/user/add", 1));
        list.add(new Menu(3, "修改用户", "/user/update", 1));
        list.add(new Menu(4, "删除用户", "/user/delete", 3));
        list.add(new Menu(5, "还原用户", "/user/rem", 3));
        list.add(new Menu(6, "其它管理", "/role/**", 0));
        list.add(new Menu(7, "角色新增", "/role/add", 6));
        list.add(new Menu(8, "角色修改", "/role/update", 6));

        // 将菜单数据转为tree形格式
        List<Menu> dataList = menuTreeData(list);

        // 打印结果
        Console.log(JSONUtil.parseArray(dataList));
        // [{"parent":0,"children":[{"parent":1,"menuName":"新增用户","id":2,"urlPath":"/user/add"},{"parent":1,"children":[{"parent":3,"menuName":"删除用户","id":4,"urlPath":"/user/delete"},{"parent":3,"menuName":"还原用户","id":5,"urlPath":"/user/rem"}],"menuName":"修改用户","id":3,"urlPath":"/user/update"}],"menuName":"用户管理","id":1,"urlPath":"/user/**"},{"parent":0,"children":[{"parent":6,"menuName":"其它新增","id":7,"urlPath":"/role/add"},{"parent":6,"menuName":"其它修改","id":8,"urlPath":"/role/update"}],"menuName":"其它管理","id":6,"urlPath":"/role/**"}]
    }



    /**
     * list数据转树形结构方法,无限制层级
     *  使用该方法依赖Menu类中的id和parent两个成员变量
     * @param list<Menu>
     * @return
     */
    public static List<Menu> menuTreeData(List<Menu> list) {
        // 转parent属性相同的数据封装到一个List中
        Map<Integer, List<Menu>> map = new HashMap<>();
        for (Menu menu : list) {
            if(!map.containsKey(menu.getParent())){
                LinkedList<Menu> Menus = new LinkedList<>();
                Menus.add(menu);
                map.put(menu.getParent(), Menus);
            }else {
                List<Menu> menus = map.get(menu.getParent());
                menus.add(menu);
            }
        }

        // 获取所有父类菜单,封装最终tree结果
        List<Menu> resultMenus = map.get(0);

        // 递归获取所有子数值
        recursionTreeChild(map, resultMenus);

        return resultMenus;
    }

    public static void recursionTreeChild(Map<Integer, List<Menu>> map, List<Menu> resultMenus) {
        for (Menu menu : resultMenus) {
            // 添加子级菜单
            if (map.containsKey(menu.getId())){
                List<Menu> menus1 = map.get(menu.getId());
                menu.setChildren(menus1);
                // 递归调用
                recursionTreeChild(map, menus1);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

祁_z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值