Java学习案例:ArrayList实现餐馆菜单管理


前言

今天学习了ArrayList,知道了add、get、remove等方法。利用这些方法实现了在控制台完成一个餐馆的菜单管理,可以增删改查菜品。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现效果

  先把效果挂出来,看到这篇笔记的朋友们,如果效果不合你们的需求可以直接退了。要有用的话直接翻下面看源码和注释。

实现效果如下:

  • 浏览功能实现效果如下:
    浏览菜单功能
  • 删除功能如下:
    在这里插入图片描述
    如图所示,删除后再次查询时,"红烧牛肉"已被移除。
    在这里插入图片描述
  • 添加菜品功能如下:
    在这里插入图片描述
  • 实现了在任何时候都可以退出的功能:

在这里插入图片描述
在这里插入图片描述

二、源码

总共分三个文件,一个是Dish类(JavaBean),一个功能类Func,一个程序入口(Main方法)。

1.Dish类

代码如下(示例):

package com.itheima.shop;

public class Dish {
    private String name;
    private String type;
    private double price;

    public Dish() {
    }

    public Dish(String name, String type, double price) {
        this.name = name;
        this.type = type;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void show() {
//        System.out.printf("编号:%d\t菜品名称:%s\t菜品类型:%s\t菜品价格%.2f",name,type,price);
        Func.beautify();
        Func.beautify(">🍔 ");
        System.out.printf("菜品名称:%s\t菜品类型:%s\t 菜品价格%.2f\r\n",name,type,price);
    }

    @Override
    public String toString() {
        return "Dish{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                '}';
    }
}

这个没什么好说的,直接使用IDEA的快捷键Alt+Insert自动生成。
在这里插入图片描述
Constructor时用来生成构造方法的,set、get选第四个全部生成。重写Ctr+O。

2.Main程序入口

代码如下(示例):

package com.itheima.shop;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ProgramEntry {
    public static void main(String[] args) {
        ArrayList<Dish> list = new ArrayList<>();
        //给菜单加点初始数据,不知道pojo模式该不该放到javaBean中,先发到Func功能类中
        Func.addInitialDish(list);
        Scanner sc = new Scanner(System.in);

        Func.beautify();
        System.out.println("====================欢迎使用商家系统====================");
        while (true) {
            Func.beautify();
            System.out.println("请选择:");
            System.out.println("| 1.菜品上架\t 2.菜品浏览\t 3.菜品下架\t 4.退出");
            Func.beautify();
            String choice = sc.next();
            switch (choice) {
                case "1":
                    Func.beautify();
//                    System.out.println("菜品上架功能暂未开发...");
                    Func.addDish(list);
                    break;
                case "2":
                    Func.beautify();
//                    System.out.println("菜品浏览功能暂未开发...");
                    Func.showDish(list);
                    break;

                case "3":
                    Func.beautify();
//                    System.out.println("菜品下架功能暂未开发...");
                    Func.removeDish(list);
                    break;
                case "4":
                    Func.exit(choice);
            }
            Func.beautify(1);
//            if (!("3".equals(choice)||"2".equals(choice)||"1".equals(choice))){
            Matcher judgeStr = Pattern.compile("^[1-4]$").matcher(choice);
            if (!(judgeStr.matches())) {
                System.out.print("请键入1、2、3以选择对应的服务!\r\n");
                Func.beautify();}
                System.out.println("======================================================");
        }
    }
}

也没什么好说的,主要打印一下首页?嗯,应该可以这样说吧?!打印完就是调用各种功能。

1.Func类

这个就是写各种功能的实现
代码如下(示例):

package com.itheima.shop;

import java.util.ArrayList;
import java.util.Scanner;

public class Func {
    public static void beautify() {
        System.out.print("| ");
    }

    public static void beautify(String symbol) {
        System.out.printf("|%s", symbol);
    }

    public static void beautify(int number) {
        for (int i = 0; i < number; i++) {
            System.out.print("| ");
            System.out.println();
        }
        beautify();
    }

    public static String exit(String exitCode) {
        if ("4".equals(exitCode)) {
            Func.beautify(1);
            System.out.println("感谢您的使用,系统已退出!");
            beautify();
            System.out.println("======================================================");
            System.exit(0);
        }
        return exitCode;
    }

    public static double exit(double exitCode) {
        if (exitCode == 3) {
            Func.beautify(1);
            System.out.println("感谢您的使用,系统已退出!");
            beautify();
            System.out.println("================================");
            System.exit(0);
        }
        return exitCode;
    }

    public static void addDish(ArrayList<Dish> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("=======================菜品上架========================");
        beautify();
        System.out.println("请输入菜品名称:");
        beautify();
        String name = exit(sc.next());
        beautify();
        System.out.println("请输入菜品口味类型:");
        beautify();
        String type = exit(sc.next());
        beautify();
        System.out.println("请输入菜品单价:");
        beautify();
        double price = exit(sc.nextDouble());
//        写main方法里,避免NoSuchElementException,next因为close提前关闭会抛出此异常
//        sc.close();
        Dish dish = new Dish(name, type, price);
        list.add(dish);
        beautify();
        System.out.println("菜品上架成功!");
    }

    public static void showDish(ArrayList<Dish> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("=======================菜品浏览========================");
        if (list.size() == 0) {
            beautify();
            System.out.println("暂无菜品信息,请先上架菜品!");
            return;
        }
        for (int i = 0; i < list.size(); i++) {
            Dish dish = list.get(i);
            String name = dish.getName();
            String type = dish.getType();
            double price = dish.getPrice();
//            dish.show(name,type,price);
            dish.show();
        }
    }

    public static void removeDish(ArrayList<Dish> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("=======================菜品下架========================");
        beautify();
        System.out.println("请输入菜品名称:");
        beautify();
        String name = sc.next();
//        从后往前遍历,删除指定菜品名称的对象
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i).getName().contains(name)) {
                list.remove(i);
                beautify();
                System.out.println("菜品下架成功!");
                return;
            }
        }

//        如果没有找到对应的菜名
            beautify(1);
            System.out.println("抱歉,未找到对应的菜名!请检查核对后再删除!");

//        在Dish中重写String类的toString方法,遍历打印集合元素以供检查
//        这里用来打印一下,测试看看有没有成功删掉
//        for (Dish a:list
//             ) {
//            System.out.println(a);
//        }
    }
//        添加一些初始数据
    public static void addInitialDish(ArrayList<Dish> list) {
        list.add(new Dish("红烧牛肉", "辣", 160));
        list.add(new Dish("东坡肉  ", "辣", 160));
        list.add(new Dish("八宝青丝", "辣", 160));
        list.add(new Dish("黑椒牛排", "辣", 160));
        list.add(new Dish("佛跳墙  ", "辣", 160));
    }
}



总结

1、如何实现在任何时候直接退出程序?
答:直接套一个退出的方法,符合退出的条件就退出,不符合就把传进来的字符串原路返回。

	
    String name = exit(sc.next());

    public static String exit(String exitCode) {
        //equals与“==”区别在于前者对比字符串本身是否相等
        //后者“==”是比对变量在堆内存的地址值是否相同
        if ("4".equals(exitCode)) {
            Func.beautify(1);
            System.out.println("感谢您的使用,系统已退出!");
            beautify();
            System.out.println("======================================================");
            System.exit(0);//这个exit是object类自带的方法,0是状态码
        }
        return exitCode;
    }

2、除了逻辑运算符,还有什么好的处理方式判断条件语句中的字符串判断?
答:使用正则表达式。

“^”表示正则表达式的开始,“$”表示正则表达式的结束。
"[ ]"则是你所要筛选的字符,如 ^ [0-9]表示字符串第一位字符必须是0-9之间的数字, ^ [249]表示字符串第一位必须是2或4或9。etc.

	//使用逻辑运算符
	if (!("3".equals(choice)||"2".equals(choice)||"1".equals(choice))){
	//使用正则表达式
	Matcher judgeStr = Pattern.compile("^[1-4]$").matcher(choice);
	if (!(judgeStr.matches())) {

3、ArrayList类中常用的方法有哪些?
答:add插入、remove移除、get获取、set设置、size返回长度。

 void		| add​(int index, E element)		| 在此列表中的指定位置插入指定的元素。 
 E			| remove​(int index)				| 删除该列表中指定位置的元素。  
 E			| get​(int index) 				| 返回此列表中指定位置的元素。 
 E			| set​(int index, E element)		| 用指定的元素替换此列表中指定位置的元素。 
 int		| size​() 						| 返回此列表中的元素数。  

E是指返回的是该元素本身,比如:

        ArrayList<String> list = new ArrayList<>();
        boolean bl = list.add("小明");
        System.out.println("小明被成功添加进list了吗?"+bl);

        String name = list.remove(0);
        System.out.printf("我从列表中移除了%s!",name);
		控制台输出:
			 小明被成功添加进list了吗?true
			 我从列表中移除了小明!

返回值E作为泛型类型的实例还可以参与链式调用,如上方变量name还可以
“小明”.equals(name)这样继续使用Sting类的方法。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值