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日

相关文章

  • 假设检验(hypothesistesting)

    假设检验(hypothesis testing) 在统计学中,假设检验(hypothesis testing)是一种用来检验、评估某个假设是否成立的方法。在假设检验中,我们会建立一个零假设(null hypothesis),然后寻找足够的证据来判断是否需要拒绝这个假设。 零假设(null hypothesis)和备择假设(alternative hypoth…

    其他 2023年3月28日
    00
  • 解决golang 关于全局变量的坑

    解决Golang关于全局变量的坑 在Golang中,全局变量的使用可能会导致一些问题,例如并发访问和不可预测的结果。为了解决这些问题,我们可以采取以下策略: 1. 使用互斥锁(Mutex) 互斥锁是一种同步原语,用于保护共享资源的访问。通过在访问全局变量之前获取互斥锁,并在访问完成后释放锁,可以确保同一时间只有一个goroutine可以访问该变量。 下面是一…

    other 2023年7月29日
    00
  • 苹果iOS9 GM版官方固件下载地址大全(百度网盘补全中)

    苹果iOS9 GM版官方固件下载地址大全(百度网盘补全中)攻略 简介 苹果iOS9 GM版是iOS9操作系统的最终测试版,提供给开发者和测试人员进行测试和反馈。本攻略将详细介绍如何获取苹果iOS9 GM版官方固件的下载地址,并提供两个示例说明。 步骤 步骤一:打开浏览器 在电脑或移动设备上打开任意浏览器,例如Google Chrome、Safari等。 步骤…

    other 2023年8月4日
    00
  • go语言开发中如何优雅得关闭协程方法

    关闭协程是go开发中一个重要而又容易被忽视的问题,一个未关闭的协程会一直占据系统资源,直到程序退出。优雅关闭协程是保证Go语言高效运行的一个关键因素。下面是一些优雅关闭协程的方法: 方法1:使用 context go 1.7版本中引入了context包,该包提供了一种可用于不同goroutine间传递上下文信息的策略。我们通过WithCancel方法实现优雅…

    other 2023年6月27日
    00
  • Android 使用AsyncTask实现断点续传

    Android 使用 AsyncTask 实现断点续传攻略 在 Android 开发中,我们可以使用 AsyncTask 类来实现断点续传功能。AsyncTask 是一个异步任务类,可以在后台执行耗时操作,并在主线程更新 UI。 步骤一:创建 AsyncTask 子类 首先,我们需要创建一个继承自 AsyncTask 的子类,用于执行断点续传的任务。在这个子…

    other 2023年9月7日
    00
  • Qt创建项目实战之手把手创建第一个Qt项目

    创建Qt项目的步骤如下: 1. 打开Qt Creator 在Qt目录下,找到Qt Creator程序并打开。 2. 创建项目 在Qt Creator中,点击”File”->”New File or Project”,弹出”New Project”对话框。 3. 选择项目类型 在”New Project”对话框中,选择”Application”项目类型,…

    other 2023年6月27日
    00
  • Remix集成antd和pro-components的过程示例

    Remix集成antd和pro-components的过程示例攻略 Remix是一个基于React的现代化JavaScript框架,它提供了一种简单而强大的方式来构建Web应用程序。在本攻略中,我们将详细讲解如何将antd和pro-components集成到Remix应用程序中。 步骤一:安装依赖 首先,我们需要安装一些必要的依赖项。打开终端并导航到你的Re…

    other 2023年9月7日
    00
  • 华为v9怎么提速? 华为v9开发者模式的设置教程

    华为v9是一款优秀的智能手机,但是有时候会出现卡顿、慢等问题。如何提速呢?接下来我将为大家详细讲解华为v9的提速方法以及如何设置开发者模式。 华为v9的提速方法 关闭后台应用 后台应用是一个非常大的资源消耗器,关闭后台不使用的应用可以有效地提升手机的速度。方法如下: 1.进入手机的“设置”界面。 2.选择“应用管理”选项。 3.选择需要关闭的应用程序。 4.…

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