Java递归实现多级菜单

文章讲述了如何在Java中使用递归方法构建一个多级菜单树结构,涉及LabelManage类的实体定义以及treeList和buildTree方法的实现过程。
摘要由CSDN通过智能技术生成

Java递归实现多级菜单

实体类

public class LabelManage {
    /**
     * 主键
     */
    @TableId("ID")
    private String id;

    /**
     * 名称
     */
    @TableField("LABEL_NAME")
    private String labelName;

    /**
     * 父级节点
     */
    @TableField("PARENT_ID")
    private String parentId;

    /**
     * 父级名称
     */
    @TableField("PARENT_NAME")
    private String parentName;

    /**
     * 状态(1启动 0禁用)
     */
    @TableField("LABEL_STATUS")
    private Integer labelStatus;
    /**
     * 是否
     */
    @TableField("IS_PUBLIC")
    private Integer isPublic;
    /**
     * 是否
     */
    @TableField("IS_MUTUALLY_EXCLUSIVE")
    private Integer isMutuallyExclusive;
    /**
     * 排序
     */
    @TableField("SORT_NUM")
    private Integer sortNum;
    /**
     * 描述
     */
    @TableField("DESCRIPTION")
    private String description;
    /**
     * 删除人
     */
    @TableField("DELETED_ID")
    private String deletedId;
    /**
     * 删除时间
     */
    @TableField("DELETED_TIME")
    private Date deletedTime;

    @TableField(exist = false)
    private List<LabelManage> children;

}

生成树菜单

@Override
    public List<LabelManage> treeList(Map<String, String> params) {
   
        List<LabelManage> list = mapper.getTreeList(params);
        //根节点集合
        List<LabelManage> rootMenu = new ArrayList<>();
        for (LabelManage entity : list) {
            //父节点是-1的,为根节点。
            if (entity.getParentId().equals("-1")) {
                rootMenu.add(entity);
            }
        }
        /* 根据LabelManage类的CreateTime倒序排序 */
        rootMenu.sort(Comparator.comparing(LabelManage::getCreateTime).reversed());
        //为根菜单设置子菜单,getClild是递归调用的
        for (LabelManage entity : rootMenu) {
            /* 获取根节点下的所有子节点 使用getChild方法*/
            List<LabelManage> childList = buildTree(entity.getId(), list);
            //给根节点设置子节点
            entity.setChildren(childList);
        }
        return rootMenu;
    }

    /**
     * 获取子节点
     *
     * @param id      父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下,所有子菜单列表
     */
    public List<LabelManage> buildTree(String id, List<LabelManage> allMenu) {
        //子菜单
        List<LabelManage> childList = new ArrayList<>();
        for (LabelManage entity : allMenu) {
            // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
            //相等说明:为该根节点的子节点。
            if (entity.getParentId().equals(id)) {
                childList.add(entity);
            }
        }
        //递归
        for (LabelManage entity : childList) {
            entity.setChildren(buildTree(entity.getId(), allMenu));
        }
        //排序
        childList.sort(Comparator.comparing(LabelManage::getCreateTime).reversed());
        //如果节点下没有子节点,返回一个空List(递归退出)
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        return childList;
    }

效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值