java递归设置层级菜单的实现

yizhihongxing

Java递归设置层级菜单的实现,可以通过以下几个步骤来完成:

设计数据模型

首先需要设计数据模型,以便存储菜单的信息。这里我们可以使用一个Menu类来表示菜单,它包含以下几个属性:

  • id:菜单的唯一标识符。
  • name:菜单名称。
  • parentId:菜单的父节点标识符,如果为0表示该菜单是顶级菜单。
  • children:菜单的子节点列表,如果没有子节点则为null。

下面是Menu类的代码实现:

public class Menu {
    private Integer id;
    private String name;
    private Integer parentId;
    private List<Menu> children;

    // ... 省略 getter 和 setter 方法
}

递归实现设置层级菜单

接下来就可以使用递归的方式来设置层级菜单了。具体实现步骤如下:

  1. 创建一个Map对象,用于存储菜单的id和对应的菜单对象。
Map<Integer, Menu> menuMap = new HashMap<>();
  1. 遍历菜单列表,将每个菜单对象存储到menuMap中。
for (Menu menu : menuList) {
    menuMap.put(menu.getId(), menu);
}
  1. 遍历菜单列表,为每个菜单对象设置子节点列表。
for (Menu menu : menuList) {
    if (menu.getParentId() != null && menu.getParentId() > 0) {
        Menu parentMenu = menuMap.get(menu.getParentId());
        if (parentMenu != null) {
            if (parentMenu.getChildren() == null) {
                parentMenu.setChildren(new ArrayList<Menu>());
            }
            parentMenu.getChildren().add(menu);
        }
    }
}
  1. 返回顶级菜单列表。
List<Menu> topLevelMenus = new ArrayList<>();
for (Menu menu : menuList) {
    if (menu.getParentId() == null || menu.getParentId() == 0) {
        topLevelMenus.add(menu);
    }
}
return topLevelMenus;

完整代码示例如下:

public class MenuUtil {
    public static List<Menu> createMenuTree(List<Menu> menuList) {
        Map<Integer, Menu> menuMap = new HashMap<>();
        for (Menu menu : menuList) {
            menuMap.put(menu.getId(), menu);
        }
        for (Menu menu : menuList) {
            if (menu.getParentId() != null && menu.getParentId() > 0) {
                Menu parentMenu = menuMap.get(menu.getParentId());
                if (parentMenu != null) {
                    if (parentMenu.getChildren() == null) {
                        parentMenu.setChildren(new ArrayList<Menu>());
                    }
                    parentMenu.getChildren().add(menu);
                }
            }
        }
        List<Menu> topLevelMenus = new ArrayList<>();
        for (Menu menu : menuList) {
            if (menu.getParentId() == null || menu.getParentId() == 0) {
                topLevelMenus.add(menu);
            }
        }
        return topLevelMenus;
    }
}

示例说明

示例1

假设有以下菜单列表:

id name parentId
1 首页 0
2 动态 0
3 Java 2
4 Python 2
5 PHP 2
6 Spring 3
7 Hibernate 3
8 Flask 4
9 Django 4
10 CodeIgniter 5
11 Laravel 5

如果要生成层级菜单,可以使用以下代码:

List<Menu> menuList = new ArrayList<>();
menuList.add(new Menu(1, "首页", 0, null));
menuList.add(new Menu(2, "动态", 0, null));
menuList.add(new Menu(3, "Java", 2, null));
menuList.add(new Menu(4, "Python", 2, null));
menuList.add(new Menu(5, "PHP", 2, null));
menuList.add(new Menu(6, "Spring", 3, null));
menuList.add(new Menu(7, "Hibernate", 3, null));
menuList.add(new Menu(8, "Flask", 4, null));
menuList.add(new Menu(9, "Django", 4, null));
menuList.add(new Menu(10, "CodeIgniter", 5, null));
menuList.add(new Menu(11, "Laravel", 5, null));

List<Menu> menuTree = MenuUtil.createMenuTree(menuList);

最终生成的层级菜单如图所示:

- 首页
- 动态
  - Java
    - Spring
    - Hibernate
  - Python
    - Flask
    - Django
  - PHP
    - CodeIgniter
    - Laravel

示例2

假设有以下菜单列表:

id name parentId
1 菜单1 0
2 菜单2 0
3 菜单3 1
4 菜单4 1
5 菜单5 3
6 菜单6 4
7 菜单7 6
8 菜单8 5
9 菜单9 2
10 菜单10 0

如果要生成层级菜单,可以使用以下代码:

List<Menu> menuList = new ArrayList<>();
menuList.add(new Menu(1, "菜单1", 0, null));
menuList.add(new Menu(2, "菜单2", 0, null));
menuList.add(new Menu(3, "菜单3", 1, null));
menuList.add(new Menu(4, "菜单4", 1, null));
menuList.add(new Menu(5, "菜单5", 3, null));
menuList.add(new Menu(6, "菜单6", 4, null));
menuList.add(new Menu(7, "菜单7", 6, null));
menuList.add(new Menu(8, "菜单8", 5, null));
menuList.add(new Menu(9, "菜单9", 2, null));
menuList.add(new Menu(10, "菜单10", 0, null));

List<Menu> menuTree = MenuUtil.createMenuTree(menuList);

最终生成的层级菜单如图所示:

- 菜单1
  - 菜单3
    - 菜单5
  - 菜单4
    - 菜单6
      - 菜单7
- 菜单2
  - 菜单9
- 菜单10

以上是Java递归设置层级菜单的实现攻略。

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

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

相关文章

  • 苹果watchOS 6.1.2开发者预览版Beta2推送 提供安全性更新

    苹果watchOS 6.1.2开发者预览版Beta2推送 提供安全性更新 苹果公司宣布推送watchOS 6.1.2的开发者预览版Beta2,为苹果手表提供了更高的稳定性和安全性。本篇攻略将介绍更新的步骤,可以让你更好地了解如何更新你的苹果手表。 步骤1:备份数据 在更新watchOS之前,请务必备份现有数据以避免数据丢失。以下是备份数据的步骤: 打开“Wa…

    other 2023年6月26日
    00
  • 常用yum操作命令

    当然,我很乐意为您提供有关“常用yum操作命令”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是yum? yum是CentOS和Red Hat Enterprise Linux(RHEL)中的包管理器,用于安装、更新和删除软件包。它可以自动解决依赖关系,并从软件仓库中下载和安装软件包。 2. 常用yum操作命令 以下是常用的yum操作命令: 2.1 安…

    other 2023年5月6日
    00
  • 易语言调用api枚举网卡名称并且获取信息的代码

    下面是关于“易语言调用API枚举网卡名称并获取信息”的完整攻略。 1. 前提知识 在进行本操作之前,需要了解以下内容: 理解API函数调用的基本原理、参数类型和返回值类型。 理解Windows系统中的网络配置和网卡信息。 掌握基本的Windows网络编程知识。 2. 调用API枚举网卡名称并获取信息 2.1 获取网卡列表 在Windows系统中,我们可以使用…

    other 2023年6月20日
    00
  • 分享Android开发自学笔记之AndroidStudio常用功能

    分享Android开发自学笔记之AndroidStudio常用功能攻略 介绍 本攻略将详细讲解AndroidStudio中的常用功能,帮助您更好地进行Android开发。以下是一些示例说明。 1. 代码自动补全 AndroidStudio提供了强大的代码自动补全功能,可以大大提高编码效率。当您输入代码时,它会根据上下文和已有的代码提示您可能需要的代码片段。 …

    other 2023年8月25日
    00
  • vue定义全局变量和全局方法的方法示例

    当使用Vue.js开发应用程序时,有时需要在整个应用程序中共享一些数据或方法。为了实现这一目标,可以使用Vue的全局变量和全局方法。 定义全局变量 要定义一个全局变量,可以使用Vue的prototype属性。下面是一个示例: // main.js import Vue from ‘vue’ Vue.prototype.$globalVariable = ‘H…

    other 2023年7月29日
    00
  • 什么是数据结构?

    数据结构是计算机科学中的一种非常重要的概念,它描述了数据的组织方式和处理方法,是解决各种复杂问题的必要基础。本文将介绍数据结构完整攻略的流程和相关概念。 数据结构的基本概念 数据结构的基本概念包括数据、数据元素、数据对象、数据类型和数据结构。 数据: 数据是描述某种事物的符号,是计算机程序处理的对象; 数据元素: 组成数据的基本单位,是数据结构中的基本对象;…

    其他 2023年4月19日
    00
  • java如何使用fastjson修改多层嵌套的Objectjson数据

    Java使用Fastjson修改多层嵌套的Object JSON数据攻略 Fastjson是一个Java语言编写的高性能JSON处理器,它提供了一种简单而灵活的方式来处理JSON数据。下面是使用Fastjson修改多层嵌套的Object JSON数据的完整攻略。 步骤1:导入Fastjson库 首先,你需要在你的Java项目中导入Fastjson库。你可以通…

    other 2023年7月28日
    00
  • URL目录文件名优化过程中的14大技巧

    下面我将为您详细讲解“URL目录文件名优化过程中的14大技巧”的完整攻略。 1. 表示层URL与实际URL分开 将网站的URL分成两部分,表示层URL和实际URL。表示层URL用于展示和用户访问,实际URL则用于服务器访问和处理。 示例说明:例如,网站的表示层URL为:https://www.example.com/article/123,而实际URL为:h…

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