You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java餐厅账单系统:实现订单数量累加而非覆盖的问题求助

餐厅账单系统问题解决方向

核心问题分析

  1. addOrder方法逻辑错误
    原方法遍历已点菜品时,只要当前项不匹配就直接添加新菜品,会导致同一菜品被重复添加;且当orderedFood为空时,循环不会执行,新菜品根本无法加入列表。
  2. 订单数据丢失
    每次调用Order()方法都会新建Bill对象,之前的订单数据存储在旧对象中,最终调用getOrder()时拿不到历史订单。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:31:15