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("------------------------"); // 分隔线,优化交互体验 } } }
关键改动说明
- 封装商品信息:新增
GroceryItem类,把每个商品的名称和价格绑定成一个对象,这是解决所有问题的基础。 - 统一购物篮实例:在Main的循环外创建
GroceryPackage对象,确保所有添加/删除/查看操作都针对同一个购物篮。 - 修正添加逻辑:
addGrocery()现在接收名称和价格,先检查是否有同名商品,再添加完整的GroceryItem对象,满足“禁止重复名称”的需求。 - 实现按名称删除:
removeGrocery()遍历购物篮列表,找到同名商品并移除,返回操作结果给Main类用于提示用户。 - 优化查看功能:
printAllItems()格式化输出每个商品的名称和价格,和你预期的格式完全一致,还处理了空购物篮的情况。 - 增强用户体验:处理了输入的大小写(比如输入"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
相关产品推荐
相关产品推荐

