Java 递归查询子菜单实现

介绍

在Java开发中,经常会遇到需要查询子菜单的情况。递归是一种非常常用的解决方案,能够简单、高效地实现对子菜单的查询操作。本文将通过详细的步骤和代码示例,教会你如何用Java递归查询子菜单。

步骤

下面是实现Java递归查询子菜单的步骤:

步骤 描述
1 定义菜单数据结构
2 加载菜单数据
3 编写递归查询子菜单的方法
4 调用递归方法

让我们逐步来完成这些步骤。

定义菜单数据结构

首先,我们需要定义一个菜单数据结构,用于存储菜单的信息。我们可以使用一个类来表示菜单项,其中包含菜单项的ID、名称和父菜单项的ID。下面是一个示例代码:

public class MenuItem {
    private int id;
    private String name;
    private int parentId;

    // 构造函数和 getter/setter 方法省略
}

加载菜单数据

接下来,我们需要加载菜单数据。菜单数据可以来自数据库、文件或其他数据源。为了简化示例,我们假设菜单数据已经存储在一个列表中。下面是一个示例代码:

List<MenuItem> menuItems = new ArrayList<>();
menuItems.add(new MenuItem(1, "菜单1", 0));
menuItems.add(new MenuItem(2, "菜单2", 0));
menuItems.add(new MenuItem(3, "菜单1.1", 1));
menuItems.add(new MenuItem(4, "菜单1.1.1", 3));
menuItems.add(new MenuItem(5, "菜单2.1", 2));

编写递归查询子菜单的方法

现在我们来编写递归查询子菜单的方法。该方法接收一个菜单项的ID作为参数,返回该菜单项的所有子菜单。下面是一个示例代码:

List<MenuItem> findSubMenuItems(int parentId, List<MenuItem> menuItems) {
    List<MenuItem> subMenuItems = new ArrayList<>();
    for (MenuItem menuItem : menuItems) {
        if (menuItem.getParentId() == parentId) {
            subMenuItems.add(menuItem);
            // 递归查询子菜单
            List<MenuItem> childSubMenuItems = findSubMenuItems(menuItem.getId(), menuItems);
            subMenuItems.addAll(childSubMenuItems);
        }
    }
    return subMenuItems;
}

调用递归方法

最后,我们只需要调用递归方法,传入根菜单项的ID即可查询所有子菜单。下面是一个示例代码:

List<MenuItem> subMenuItems = findSubMenuItems(0, menuItems);
for (MenuItem subMenuItem : subMenuItems) {
    System.out.println(subMenuItem.getName());
}

完整代码示例

下面是完整的代码示例:

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<MenuItem> menuItems = new ArrayList<>();
        menuItems.add(new MenuItem(1, "菜单1", 0));
        menuItems.add(new MenuItem(2, "菜单2", 0));
        menuItems.add(new MenuItem(3, "菜单1.1", 1));
        menuItems.add(new MenuItem(4, "菜单1.1.1", 3));
        menuItems.add(new MenuItem(5, "菜单2.1", 2));
        
        List<MenuItem> subMenuItems = findSubMenuItems(0, menuItems);
        for (MenuItem subMenuItem : subMenuItems) {
            System.out.println(subMenuItem.getName());
        }
    }

    static List<MenuItem> findSubMenuItems(int parentId, List<MenuItem> menuItems) {
        List<MenuItem> subMenuItems = new ArrayList<>();
        for (MenuItem menuItem : menuItems) {
            if (menuItem.getParentId() == parentId) {
                subMenuItems.add(menuItem);
                List<MenuItem> childSubMenuItems = findSubMenuItems(menuItem.getId(), menuItems);
                subMenuItems.addAll(childSubMenuItems);
            }
        }
        return subMenu