前言
今天学习了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类的方法。