diff --git a/src/chapter5/ShoppingCart.java b/src/chapter5/ShoppingCart.java new file mode 100644 index 0000000..bf9b806 --- /dev/null +++ b/src/chapter5/ShoppingCart.java @@ -0,0 +1,132 @@ +package chapter5; + +/** + * 双十一购物车 + * 需求: + * 1. 添加商品到购物车(商品名称用StringBuilder拼接) + * 2. 显示购物车商品清单(把StringBuilder转换为String输出) + * 3. 修改商品名称(用String的replace方法) + * 4. 删除购物车某个商品(用StringBuilder的delete方法) + * 5. 计算购物车商品总价 + */ +public class ShoppingCart { + private StringBuilder cart; // 购物车商品列表 + private double totalPrice; // 总价格 + + /** + * 构造方法思路: + * 1. 创建空的购物车,使用StringBuilder存储商品信息 + * 2. 初始化总价为0 + * 为什么使用StringBuilder?因为购物车内容会经常变动,StringBuilder更适合频繁修改 + */ + public ShoppingCart() { + cart = new StringBuilder(); + totalPrice = 0.0; + } + + /** + * addItem方法思路: + * 1. 判断购物车是否为空 + * - 如果不空,需要先添加分隔符", " + * - 如果是空的,直接添加商品 + * 2. 拼接商品信息:商品名(¥价格) + * 例如:小米手机(¥1999.0) + * 3. 更新总价 + * + * 考虑:为什么要加if判断? + * - 为了避免第一个商品前也加逗号 + * - 让商品列表更美观:商品1(¥xx), 商品2(¥xx), 商品3(¥xx) + */ + public void addItem(String item, double price) { + if (!cart.isEmpty()) { + cart.append(", "); + } + cart.append(item).append("(¥").append(price).append(")"); + totalPrice += price; + } + + /** + * showCart方法思路: + * 1. 先判断购物车是否为空 + * - 如果为空,返回提示信息 + * - 如果不为空,显示商品清单和总价 + * 2. 把StringBuilder转换为String返回 + * + * 为什么要转换成String? + * - String更适合显示最终结果 + * - println方法接收String类型参数 + */ + public String showCart() { + if (cart.isEmpty()) { + return "购物车是空的呢,快去选购吧!"; + } + return "购物车商品: " + cart.toString() + "\n总价: ¥" + totalPrice; + } + + /** + * modifyItem方法思路: + * 1. 先将StringBuilder转换为String + * 2. 使用String的replace方法替换商品名 + * 3. 将修改后的String再转回StringBuilder + * + * 为什么要转换来转换去? + * - String的replace方法使用更方便 + * - StringBuilder没有直接的替换方法 + * 注意:这里没有修改价格,实际项目中可能需要考虑价格变化 + */ + public void modifyItem(String oldItem, String newItem) { + String cartStr = cart.toString(); + cartStr = cartStr.replace(oldItem, newItem); + cart = new StringBuilder(cartStr); + } + + /** + * removeItem方法思路: + * 1. 找到要删除商品名的起始位置(indexOf) + * 2. 如果找到了(start != -1): + * - 找到这个商品信息的结束位置(")"的位置再+1) + * - 如果后面还有商品,则多删除", "这两个字符 + * 3. 使用StringBuilder的delete方法删除 + * 4. 更新总价 + * + * 难点解析: + * end < cart.length() && cart.charAt(end) == ',' + * - 为什么要判断end < cart.length()?避免数组越界 + * - 为什么要判断逗号?确保后面还有其他商品 + */ + public void removeItem(String item, double price) { + int start = cart.indexOf(item); + if (start != -1) { + int end = cart.indexOf(")", start) + 1; + if (end < cart.length() && cart.charAt(end) == ',') { + end += 2; // 删除后面的逗号和空格 + } + cart.delete(start, end); + totalPrice -= price; + } + } + + public static void main(String[] args) { + // 测试购物车 + ShoppingCart cart = new ShoppingCart(); + System.out.println(cart.showCart()); + System.out.println(); + + // 添加商品 + cart.addItem("小米手机", 1999.0); + cart.addItem("耳机", 299.0); + cart.addItem("充电器", 39.9); + System.out.println("添加商品后:"); + System.out.println(cart.showCart()); + + // 修改商品名称 + cart.modifyItem("小米手机", "华为手机"); + System.out.println("\n修改商品后:"); + System.out.println(cart.showCart()); + + // 删除商品 + cart.removeItem("耳机", 299.0); + System.out.println("\n删除商品后:"); + System.out.println(cart.showCart()); + } +}