java实现递归菜单树

Java实现递归菜单树

在项目开发中,经常需要使用树形结构展示菜单、权限等。本文将详细讲解如何使用Java实现递归菜单树。

步骤

  1. 设计菜单数据模型。

    java
    public class Menu {
    private Integer id;
    private String name;
    private Integer parentId;
    // getter和setter方法省略
    }

  2. 获取所有菜单数据。

    java
    List<Menu> allMenus = menuDao.selectAllMenus();

  3. 构建根节点和子节点列表。

java
List<Menu> rootMenus = new ArrayList<>(); // 存储根节点列表
Map<Integer, List<Menu>> childMap = new HashMap<>(); // 存储子节点列表
for (Menu menu : allMenus) {
if (menu.getParentId() == 0) { // 如果是根节点
rootMenus.add(menu); // 放到根节点列表中
} else { // 如果是子节点
if (childMap.containsKey(menu.getParentId())) {
childMap.get(menu.getParentId()).add(menu); // 放到对应父节点的子节点列表中
} else {
List<Menu> childList = new ArrayList<>();
childList.add(menu);
childMap.put(menu.getParentId(), childList);
}
}
}

  1. 递归根节点,构建整个菜单树。

java
public void buildMenuTree(Menu rootMenu) {
List<Menu> childList = childMap.get(rootMenu.getId());
if (childList != null) {
rootMenu.setChildList(childList);
for (Menu childMenu : childList) {
buildMenuTree(childMenu);
}
}
}
for (Menu rootMenu : rootMenus) {
buildMenuTree(rootMenu);
}

至此,递归菜单树已经构建完成。

示例

假设有以下菜单数据:

id | name        | parentId
1  | System     | 0
2  | User       | 1
3  | Role       | 1
4  | Permission | 3
5  | Log        | 1

执行代码后得到的结果为:

[
  {
    "id": 1,
    "name": "System",
    "parentId": 0,
    "childList": [
      {
        "id": 2,
        "name": "User",
        "parentId": 1,
        "childList": null
      },
      {
        "id": 3,
        "name": "Role",
        "parentId": 1,
        "childList": [
          {
            "id": 4,
            "name": "Permission",
            "parentId": 3,
            "childList": null
          }
        ]
      },
      {
        "id": 5,
        "name": "Log",
        "parentId": 1,
        "childList": null
      }
    ]
  }
]

小结

本文详细介绍了Java实现递归菜单树的步骤,并给出了示例代码。递归菜单树在项目开发中非常常见,熟练掌握递归算法是每个Java开发者必备的技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现递归菜单树 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 遗迹灰烬重生强力Build攻略 全武器、护甲与改装获取方法

    遗迹灰烬重生强力Build攻略 背景介绍 《遗迹:灰烬重生》是一款由 Perfect World 和 Miracle Games 开发的动作冒险类游戏,该游戏融合了RPG、动作、探险等元素,玩家可以在游戏中扮演一个古代遗迹的探险者,通过与各种各样的敌人战斗获取装备,不断提升自己的实力。 角色Build的重要性 在《遗迹:灰烬重生》的世界中,不同的武器、护甲、…

    other 2023年6月27日
    00
  • Golang安装和使用protocol-buffer流程介绍

    以下是Golang安装和使用protocol-buffer的流程介绍的完整攻略: Golang安装和使用protocol-buffer流程介绍 步骤1:安装Golang 首先,您需要安装Golang。您可以从Golang官方网站(https://golang.org)下载适合您操作系统的安装包,并按照官方指南进行安装。 步骤2:安装protocol-buff…

    other 2023年10月13日
    00
  • 网上邻居右键属性打不开怎么办 网上邻居右键属性打不开的解决方法

    下面我来为大家详细讲解“网上邻居右键属性打不开怎么办 网上邻居右键属性打不开的解决方法”。 问题描述 在使用电脑连接局域网或者广域网时,有时会出现网上邻居右键属性打不开的问题,导致无法查看网络连接状态和设置相关属性。 解决方法 下面我将为大家提供两种解决方法: 方法一:注册表修复法 通过修复注册表的方式可以解决网上邻居右键属性打不开的问题。具体步骤如下: 打…

    other 2023年6月27日
    00
  • Android自定义控件深入学习 Android生成随机验证码

    Android自定义控件深入学习 Android自定义控件是Android开发中非常重要的一部分。一个好的自定义控件可以提高Android应用程序的用户体验并带来更好的用户体验。下面是一些深入学习Android自定义控件的方法: 1.1. 学习基本的绘图和视图知识 在开始学习自定义控件之前,首先要掌握一些基本的绘图和视图知识。了解绘图和视图的基本概念、原理和…

    other 2023年6月25日
    00
  • JS应用正则表达式转换大小写示例

    JS应用正则表达式转换大小写示例攻略 正则表达式是一种强大的工具,可以在JavaScript中用于字符串的匹配和替换操作。下面是一个详细的攻略,展示了如何使用正则表达式来转换字符串的大小写。 示例1:将字符串转换为全大写 const str = \"hello, world!\"; const uppercaseStr = str.toU…

    other 2023年8月16日
    00
  • ios7.1 beta5固件下载:苹果ios7.1 beta5固件下载地址汇总介绍

    iOS 7.1 Beta 5固件下载攻略 苹果公司发布了iOS 7.1 Beta 5固件,这是一个测试版本,提供给开发者和测试人员使用。本攻略将详细介绍如何下载iOS 7.1 Beta 5固件,并提供下载地址汇总。 步骤一:注册为苹果开发者 在下载iOS 7.1 Beta 5固件之前,您需要注册为苹果开发者。请按照以下步骤进行注册: 访问苹果开发者网站(ht…

    other 2023年8月4日
    00
  • 关于python:删除列表最后一个元素的最有效方法?

    Python中删除列表最后一个元素的最有效方法 在Python中,删除列表最后一个元素是一个常见的操作。本文将详细讲解如何在Python中删除列表最后一个素包括两种方法和示例说明。 方法一:使用pop()函数 可以使用Python内置的pop()函数来删除列表最后一个元素。具体步骤如下: my_list = [1, 2,3, 4, 5] my_list.po…

    other 2023年5月8日
    00
  • 已知文件类型的扩展名如何设置显示与隐藏?

    要设置文件类型的扩展名的显示与隐藏,您可以按照以下步骤进行操作: 打开文件资源管理器(Windows)或Finder(Mac)。 在菜单栏中,选择“查看”(Windows)或“显示”(Mac)选项。 在下拉菜单中,找到并点击“文件扩展名”(Windows)或“扩展名”(Mac)选项。这将在文件名后面显示或隐藏文件的扩展名。 示例1:显示文件扩展名假设您有一个…

    other 2023年8月5日
    00
合作推广
合作推广
分享本页
返回顶部