Java2024/src/chapter5/ShoppingCart.java
2024-11-08 08:51:52 +08:00

203 lines
6.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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());
}
}