Java实现一个简易版的多级菜单功能

Java实现一个简易版的多级菜单功能

思路概述

实现一个简易版的多级菜单功能,需要用到递归和HashMap的知识。我们可以将菜单项存储在HashMap中,其中键为菜单名称,值为对应菜单的子菜单。如果一个菜单项没有子菜单,我们将其子菜单设置为null。

通过递归的方式,我们可以深度遍历每个菜单项,并打印出每个菜单项的名称。如果该菜单项还有子菜单,我们则继续递归处理。

代码示例

示例一:使用HashMap存储菜单项

import java.util.HashMap;
import java.util.Scanner;

public class Menu {
    private HashMap<String, Menu> children;    // 子菜单项
    private String name;                       // 菜单项名称

    public Menu(String name) {
        this.name = name;
        this.children = new HashMap<>();
    }

    // 添加子菜单项
    public void addChildMenu(Menu menu) {
        children.put(menu.getName(), menu);
    }

    // 获取菜单项名称
    public String getName() {
        return name;
    }

    // 打印菜单项列表
    public void printMenu(int level) {
        String prefix = "";  // 前缀字符串
        for (int i = 0; i < level; i++) {
            prefix += "--";
        }
        System.out.println(prefix + getName());  // 打印菜单项名称

        // 递归打印子菜单项
        if (children != null) {
            for (Menu menu : children.values()) {
                menu.printMenu(level + 1);
            }
        }
    }

    public static void main(String[] args) {
        Menu root = new Menu("root");      // 根菜单项
        Menu file = new Menu("file");      // 一级菜单项
        Menu edit = new Menu("edit");      // 一级菜单项
        Menu sub1 = new Menu("sub1");      // 二级菜单项
        Menu sub2 = new Menu("sub2");      // 二级菜单项
        Menu sub3 = new Menu("sub3");      // 二级菜单项

        root.addChildMenu(file);
        root.addChildMenu(edit);
        file.addChildMenu(sub1);
        file.addChildMenu(sub2);
        edit.addChildMenu(sub3);

        root.printMenu(0);
    }
}

运行上面的代码示例,可以输出以下结果:

root
--file
----sub1
----sub2
--edit
----sub3

示例二:使用Scanner实现交互式输入

import java.util.HashMap;
import java.util.Scanner;

public class Menu {
    private HashMap<String, Menu> children;    // 子菜单项
    private String name;                       // 菜单项名称

    public Menu(String name) {
        this.name = name;
        this.children = new HashMap<>();
    }

    // 添加子菜单项
    public void addChildMenu(Menu menu) {
        children.put(menu.getName(), menu);
    }

    // 获取菜单项名称
    public String getName() {
        return name;
    }

    // 打印菜单项列表
    public void printMenu(int level) {
        String prefix = "";  // 前缀字符串
        for (int i = 0; i < level; i++) {
            prefix += "--";
        }
        System.out.println(prefix + getName());  // 打印菜单项名称

        // 递归打印子菜单项
        if (children != null) {
            for (Menu menu : children.values()) {
                menu.printMenu(level + 1);
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Menu root = new Menu("root");      // 根菜单项

        while (true) {
            System.out.println("请输入菜单项名称:");
            String name = scanner.nextLine();
            if (name.equals("exit")) {
                break;
            }
            String[] items = name.split("\\.");
            Menu parent = root;             // 默认是根菜单项
            for (int i = 0; i < items.length; i++) {
                String item = items[i];
                Menu child = parent.children.get(item);
                if (child == null) {
                    child = new Menu(item);
                    parent.addChildMenu(child);
                }
                parent = child;
            }
        }

        root.printMenu(0);
    }
}

运行上面的代码示例,可以手动输入菜单项名称,并输出相应的菜单项列表。例如,下面的输入:

文件
文件.新建
文件.保存
编辑
编辑.撤销
编辑.恢复
exit

将会输出以下菜单项列表:

root
--文件
----新建
----保存
--编辑
----撤销
----恢复

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现一个简易版的多级菜单功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java多线程之Park和Unpark原理

    Java多线程中的Park和Unpark是线程同步关键字,常用于线程间等待和通知的操作。在本次攻略中,将深入讲解Park和Unpark的实现原理,并提供两条示例说明。 Park和Unpark的基本概念 Park和Unpark是Java多线程中用于实现线程等待和通知机制的一对关键字。 其中,Park的作用是使线程等待,将其挂起,并将线程的状态设置为WAITIN…

    Java 2023年5月19日
    00
  • Java swing实现支持录音等功能的钢琴程序

    如何实现Java Swing支持录音等功能的钢琴程序? 导入所需库文件 实现这个功能的Java库有很多,我们可以使用Java Sound API、Java Media Framework、JLGui和JLayer。为了方便起见,我们在这里使用Java Sound API来实现这个功能。我们需要导入下面的库文件: <dependency> <…

    Java 2023年5月23日
    00
  • java calendar 日期实现不断加一天的代码

    此处提供两种计算 Java 日期的方法,可以达到不断加一天的效果。 方法一:使用 Calendar 类 Java 中可以使用 Calendar 类来操作日期,这个类提供了丰富的方法来计算日期、时间、星期等信息,而且使用 Calendar 类也很简单。下面给出示例代码: import java.util.Calendar; public class Calen…

    Java 2023年5月20日
    00
  • Java面试题冲刺第二十六天–实战编程2

    《Java面试题冲刺第二十六天–实战编程2》是一篇介绍Java编程实战题的文章,主要内容包括实现一个电商系统购物车功能,实现一个基于LinkedList实现的栈。 实现一个电商系统购物车功能 这道题目要求我们实现一个电商网站的购物车功能,具体要求如下: 添加商品到购物车 从购物车中删除商品 修改购物车中商品的数量 清空购物车 查看购物车中的商品列表 为了实…

    Java 2023年5月19日
    00
  • 详解Java基础篇–面向对象1(构造方法,static、this关键字)

    详解Java基础篇–面向对象1 构造方法 什么是构造方法 构造方法是一种特殊的方法,它用来初始化对象。当创建一个对象时,构造方法会被调用,用于初始化实例变量。 构造方法的特点 构造方法名必须与类名相同 没有返回值,包括void 可以有多个构造方法,我们称之为构造方法的重载 构造方法在使用new关键字创建对象时自动调用 构造方法的使用示例 public cl…

    Java 2023年5月26日
    00
  • ExtJs 实现动态加载grid完整示例

    下面是ExtJs实现动态加载grid完整示例的攻略: 概述 在实际开发中,有时候需要动态加载grid数据,在数据量较大的情况下,提高页面加载速度,减少用户等待时间,这就需要使用ExtJs实现动态加载grid数据。ExtJs中实现动态加载grid数据的方式有两种,一种是使用分页加载数据,另一种是使用滚动加载数据,下面我们将详细介绍这两种方式以及示例。 分页加载…

    Java 2023年5月20日
    00
  • C#中的9个“黑魔法”

    下面是详细讲解 “C#中的9个“黑魔法””: 1. Reflector Reflector 是一款第三方反编译工具,它能够将 .NET 程序编译后的程序集反编译成 C# 代码、IL 代码等多种格式,不仅可以加深我们对代码的理解,还可以帮助我们阅读和调试第三方代码。对于 C# 程序员来说,Reflector 可谓是必备工具之一。 举个例子,如下是一个由 .NE…

    Java 2023年5月31日
    00
  • MyBatis通用Mapper中的通用example(排序)详解

    关于“MyBatis通用Mapper中的通用example(排序)详解”的攻略,我会从以下几个方面进行讲解: 了解通用Mapper 排序方法介绍 示例代码演示 接下来,我会逐一详细讲解。 1. 了解通用Mapper 通用Mapper是 MyBatis 中的一个插件,可以自动化生成针对单表的基础 SQL 操作(增删改查),并且提供了通用的 Example 条件…

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