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

Java购物篮程序开发求助:删除与查看功能实现问题

购物篮Java程序问题修复方案

嘿,我来帮你搞定这个购物篮程序的问题!先梳理下现有代码里的核心问题,再给你一套能完美实现需求的修正版本,保证符合你的预期运行流程~

现有代码的核心问题

  • 商品信息未封装:现在用ArrayList<String>存商品,把名称和价格当成两个独立元素,完全没法对应起来,导致查看和删除逻辑全错。
  • 购物篮实例生命周期错误:每次选"A"添加商品时都新建GroceryPackage实例,之前添加的商品全存在旧实例里,根本看不到。
  • 删除方法逻辑错误:现有removeGrocery()是清空整个购物篮,不是根据名称删除指定商品,而且Main里的调用语法完全不对。
  • 查看功能实现错误:Main里直接打印GroceryPackage类名,这会输出类的哈希值,而不是商品列表;现有printGrocery()也只能打印孤立的字符串,没法展示名称+价格的对应关系。
  • 添加逻辑错误:两次调用addGrocery()分别存名称和价格,导致列表里混着名称和价格字符串,完全不符合需求。

修正后的完整代码

1. 新增GroceryItem类(封装商品名称和价格)

public class GroceryItem {
    private String name;
    private double price;

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

    // Getter方法,用于获取商品名称和价格
    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

2. 修正GroceryPackage类(管理购物篮逻辑)

import java.util.ArrayList;

public class GroceryPackage {
    private ArrayList<GroceryItem> groceryList;

    // 构造方法初始化购物篮列表
    public GroceryPackage() {
        this.groceryList = new ArrayList<>();
    }

    // 添加商品:检查名称是否重复,不重复则添加
    public boolean addGrocery(String name, double price) {
        // 遍历列表检查是否有同名商品
        for (GroceryItem item : groceryList) {
            if (item.getName().equalsIgnoreCase(name)) {
                return false; // 名称重复,添加失败
            }
        }
        groceryList.add(new GroceryItem(name, price));
        return true; // 添加成功
    }

    // 根据名称删除商品
    public boolean removeGrocery(String name) {
        // 遍历找到对应商品并移除
        for (GroceryItem item : groceryList) {
            if (item.getName().equalsIgnoreCase(name)) {
                groceryList.remove(item);
                return true; // 删除成功
            }
        }
        return false; // 未找到该商品,删除失败
    }

    // 查看全部商品,格式化输出
    public void printAllItems() {
        if (groceryList.isEmpty()) {
            System.out.println("购物篮是空的哦~");
            return;
        }
        for (GroceryItem item : groceryList) {
            System.out.printf("%s , P%.1f%n", item.getName(), item.getPrice());
        }
    }
}

3. 修正Main类(用户交互逻辑)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner myReader = new Scanner(System.in);
        // 关键:把购物篮实例放在循环外面,所有操作都针对同一个购物篮
        GroceryPackage myBasket = new GroceryPackage();

        while (true) {
            System.out.println("今天您想执行什么操作?");
            System.out.println("(A)添加商品 (R)删除商品 (S)查看全部商品");
            System.out.print("请输入指令:");
            String toDo = myReader.nextLine().trim().toUpperCase(); // 处理大小写,去除空格

            switch (toDo) {
                case "A":
                    System.out.print("新商品名称:");
                    String itemName = myReader.nextLine().trim();
                    System.out.print("新商品价格:");
                    // 处理价格输入,确保是数字
                    double itemPrice;
                    try {
                        itemPrice = Double.parseDouble(myReader.nextLine().trim());
                    } catch (NumberFormatException e) {
                        System.out.println("价格输入无效,请输入数字!");
                        break;
                    }
                    // 调用添加方法,根据返回结果提示
                    if (myBasket.addGrocery(itemName, itemPrice)) {
                        System.out.println("商品添加成功");
                    } else {
                        System.out.println("该商品名称已存在,无法添加!");
                    }
                    break;

                case "R":
                    System.out.print("请输入要删除的商品名称:");
                    String removeName = myReader.nextLine().trim();
                    if (myBasket.removeGrocery(removeName)) {
                        System.out.println("商品删除成功");
                    } else {
                        System.out.println("未找到该商品,无法删除!");
                    }
                    break;

                case "S":
                    System.out.println("购物篮中的商品:");
                    myBasket.printAllItems();
                    break;

                default:
                    System.out.println("无效指令,请输入A/R/S!");
                    break;
            }
            System.out.println("------------------------"); // 分隔线,优化交互体验
        }
    }
}

关键改动说明

  1. 封装商品信息:新增GroceryItem类,把每个商品的名称和价格绑定成一个对象,这是解决所有问题的基础。
  2. 统一购物篮实例:在Main的循环外创建GroceryPackage对象,确保所有添加/删除/查看操作都针对同一个购物篮。
  3. 修正添加逻辑:addGrocery()现在接收名称和价格,先检查是否有同名商品,再添加完整的GroceryItem对象,满足“禁止重复名称”的需求。
  4. 实现按名称删除:removeGrocery()遍历购物篮列表,找到同名商品并移除,返回操作结果给Main类用于提示用户。
  5. 优化查看功能:printAllItems()格式化输出每个商品的名称和价格,和你预期的格式完全一致,还处理了空购物篮的情况。
  6. 增强用户体验:处理了输入的大小写(比如输入"a"也能识别)、价格输入的异常(防止用户输入非数字),添加了分隔线让交互更清晰。

模拟预期运行流程

今天您想执行什么操作?
(A)添加商品 (R)删除商品 (S)查看全部商品
请输入指令:A
新商品名称:Carrot
新商品价格:100
商品添加成功

今天您想执行什么操作?
(A)添加商品 (R)删除商品 (S)查看全部商品
请输入指令:A
新商品名称:Pineapple
新商品价格:20
商品添加成功

今天您想执行什么操作?
(A)添加商品 (R)删除商品 (S)查看全部商品
请输入指令:R
请输入要删除的商品名称:Pineapple
商品删除成功

今天您想执行什么操作?
(A)添加商品 (R)删除商品 (S)查看全部商品
请输入指令:S
购物篮中的商品:
Carrot , P100.0

内容的提问来源于stack exchange,提问作者Robert.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:18:39