Java餐厅账单系统:实现订单数量累加而非覆盖的问题求助
餐厅账单系统问题解决方向
核心问题分析
- addOrder方法逻辑错误
原方法遍历已点菜品时,只要当前项不匹配就直接添加新菜品,会导致同一菜品被重复添加;且当orderedFood为空时,循环不会执行,新菜品根本无法加入列表。 - 订单数据丢失
每次调用Order()方法都会新建Bill对象,之前的订单数据存储在旧对象中,最终调用getOrder()时拿不到历史订单。 - Scanner使用不当
nextInt()读取输入后会遗留换行符,后续nextLine()会读取空字符串;递归中重复创建Scanner并关闭,会引发IO异常。
修复步骤
1. 修正addOrder方法逻辑
先完整遍历已点菜品列表,找到匹配项则更新数量;遍历结束后未找到匹配项,再添加新菜品:
public void addOrder(String meal, int quantity, String[] dish, double[] cost) { boolean found = false; // 先遍历所有已点菜品找匹配项 for (int i = 0; i < orderedFood.size(); i++) { if (orderedFood.get(i).equals(meal)) { // 用equals精准匹配,避免子串误匹配 int oldQuantity = orderedQuantity.get(i); orderedQuantity.set(i, oldQuantity + quantity); found = true; break; } } // 遍历完没找到,再添加新菜品 if (!found) { orderedFood.add(meal); orderedQuantity.add(quantity); } }
2. 避免重复创建Bill对象
将Bill对象作为参数传递给Order()方法,保证全程使用同一个实例存储订单:
// 修改Order方法,接收Bill参数 public static void Order(Bill myBill) { String[] dish = {"Sandwich", "Coffee", "Salad"}; double[] cost = {6.5, 3.2, 4.0}; // 菜单展示逻辑不变... // 不再新建Bill,直接用传入的实例 myBill.addOrder(menuItem, userQuant, dish, cost); // 后续逻辑不变... } // 程序入口处初始化Bill public static void main(String[] args) { Bill myBill = new Bill(); Order(myBill); }
3. 修复Scanner问题
复用同一个Scanner,处理nextInt()后的换行符:
public static void Order(Bill myBill, Scanner scanner) { String[] dish = {"Sandwich", "Coffee", "Salad"}; double[] cost = {6.5, 3.2, 4.0}; for (int i = 0; i < dish.length; i++) { System.out.println("\n" + dish[i] + ": " + cost[i] + "€."); } System.out.println("\nWhat would you like to order? \n"); List<String> dishList = new ArrayList<>(Arrays.asList(dish)); String menuItemTemp = scanner.nextLine(); String menuItem = ""; if (dishList.contains(menuItemTemp)) { System.out.println("\nOkay.\n"); menuItem = menuItemTemp; } else { System.out.println("Error 404 Not Found."); Order(myBill, scanner); return; // 递归后直接返回,避免执行后续代码 } System.out.println("\nHow many? \n"); int userQuant = scanner.nextInt(); scanner.nextLine(); // 读取nextInt()遗留的换行符 myBill.addOrder(menuItem, userQuant, dish, cost); System.out.println("\nOrder more? 1 - Yes. 2 - No. \n"); int menuScanner = scanner.nextInt(); scanner.nextLine(); // 处理换行符 switch (menuScanner) { case 1: System.out.println("\nOkay."); Order(myBill, scanner); break; case 2: myBill.getOrder(); System.out.println(Math.round(myBill.getTotal() * 100.00) / 100.00 + "€\n"); System.out.println("\nThanks for ordering!\n"); scanner.close(); System.exit(0); } } // 入口方法 public static void main(String[] args) { Bill myBill = new Bill(); Scanner scanner = new Scanner(System.in); Order(myBill, scanner); }
额外建议
- 用
Map<String, Integer>替代两个独立的List(orderedFood和orderedQuantity),更直观地存储菜品和数量的映射关系,简化代码逻辑。 - 避免使用递归处理用户重复下单,改用循环结构,代码更易维护。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

