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; } } /** * 清空购物车方法思路: * 1. 使用StringBuilder的setLength(0)清空购物车内容 * - 比创建新对象更高效 * - 比delete(0,length)更简洁 * 2. 重置总价为0 * * 为什么用setLength(0)而不是cart = new StringBuilder()? * - setLength(0)只是将长度设为0,原有空间仍可重用 * - 创建新对象会产生额外的内存开销 */ public void clearCart() { cart = new StringBuilder(); totalPrice = 0.0; } /** * 对购物车中指定商品应用折扣 * 折扣范围: 0.0-1.0 (例如0.8表示8折) * 实现思路: * 1. 检查折扣是否合法 * 2. 在购物车中查找商品 * 3. 提取商品原价 * 4. 计算新价格并更新购物车 * 5. 更新总价 * * @param item 要打折的商品名称 * @param discount 折扣率(0.0-1.0) * @throws IllegalArgumentException 当折扣不在有效范围内时抛出 */ public void applyDiscount(String item, double discount) { // 验证折扣是否合法 if (discount <= 0.0 || discount >= 1.0) { throw new IllegalArgumentException("折扣必须在0.0到1.0之间"); } // 查找商品在购物车中的位置 String cartStr = cart.toString(); int itemStart = cartStr.indexOf(item); if (itemStart == -1) { return; // 商品不存在,直接返回 } // 提取价格信息 int priceStart = cartStr.indexOf("¥", itemStart); int priceEnd = cartStr.indexOf(")", priceStart); double originalPrice = Double.parseDouble(cartStr.substring(priceStart + 1, priceEnd)); // 计算新价格 double newPrice = originalPrice * discount; // 更新总价 totalPrice = totalPrice - originalPrice + newPrice; // 更新购物车中的价格 String oldPriceStr = String.format("¥%.1f", originalPrice); String newPriceStr = String.format("¥%.1f", newPrice); cart.replace(priceStart, priceEnd, newPriceStr); } 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.applyDiscount("耳机", 0.8); System.out.println("\n应用折扣后:"); System.out.println(cart.showCart()); // 删除商品 cart.removeItem("耳机", 299.0); System.out.println("\n删除商品后:"); System.out.println(cart.showCart()); // 清空购物车 cart.clearCart(); System.out.println("\n清空购物车后:"); System.out.println(cart.showCart()); } }