如何实现将Wishlist商品批量添加至购物车并正确更新数量?
问题:心愿单商品批量添加至购物车时的更新逻辑错误
需求概述
- 接收Wishlist ID,将心愿单所有商品添加至购物车
- 若商品已在购物车,更新数量为两者之和
- 操作后保留原心愿单
当前问题
采用嵌套循环实现时,空购物车场景可正常添加商品,但重复调用API时仅一个商品数量更新成功,其余会被addToCart()方法覆盖。例如购物车和心愿单均包含商品A、B时,嵌套循环会产生以下操作流程:
序号 购物车商品 心愿单商品 操作 1 A A 更新 2 A B 添加 3 B A 添加 4 B B 更新
其中第1步更新后的商品A,会被第2步的addToCart()操作覆盖,导致数量回退。
当前实现代码
public void addAllToCart(String wishListId) { // 通过ID获取心愿单,赋值给wishlist(WishListModel类型) // 获取会话购物车,赋值给cart(CartModel类型) if (CollectionUtils.isNotEmpty(wishlist.getEntries())) { for (WishListEntryModel wishListEntry : wishlist.getEntries()) { checkInCartEntry(wishListEntry, cart.getEntries()); } } } private void checkInCartEntry(WishListEntryModel wishListEntry, List<AbstractOrderEntryModel> cartEntries) { if (CollectionUtils.isEmpty(cartEntries)) { addToCart(wishListEntry); } else { for (AbstractOrderEntryModel cartEntry : cartEntries) { if (wishListEntry.getProduct().getCode().equalsIgnoreCase(cartEntry.getProduct().getCode())) { updateCartEntry(cartEntry.getEntryNumber, wishlist.getQuantity+cartEntry.getQuantity); } else { addToCart(wishListEntry); } } } }
约束:无法修改addToCart()或updateCartEntry()等已有方法。
问题根源
checkInCartEntry方法逻辑错误:遍历购物车条目时,只要遇到不匹配的商品就执行addToCart(),导致同一个心愿单商品会被多次触发添加操作,直接覆盖之前的更新结果。例如心愿单的商品A在遍历购物车的商品B时,会误触发addToCart(),把已经更新过数量的A重新添加一次。
修复方案
修改checkInCartEntry方法,先标记商品是否在购物车中找到匹配项,遍历完所有购物车条目后,再决定执行更新还是添加操作:
public void addAllToCart(String wishListId) { // 通过ID获取心愿单,赋值给wishlist(WishListModel类型) // 获取会话购物车,赋值给cart(CartModel类型) if (CollectionUtils.isNotEmpty(wishlist.getEntries())) { for (WishListEntryModel wishListEntry : wishlist.getEntries()) { checkInCartEntry(wishListEntry, cart.getEntries()); } } } private void checkInCartEntry(WishListEntryModel wishListEntry, List<AbstractOrderEntryModel> cartEntries) { boolean productFoundInCart = false; if (CollectionUtils.isNotEmpty(cartEntries)) { for (AbstractOrderEntryModel cartEntry : cartEntries) { if (wishListEntry.getProduct().getCode().equalsIgnoreCase(cartEntry.getProduct().getCode())) { updateCartEntry(cartEntry.getEntryNumber(), wishListEntry.getQuantity() + cartEntry.getQuantity()); productFoundInCart = true; break; // 找到匹配项后立即退出循环,避免重复操作 } } } // 遍历完购物车后,未找到匹配项才执行添加 if (!productFoundInCart) { addToCart(wishListEntry); } }
优化思路(替代实现)
为降低嵌套循环的O(n*m)复杂度,可先将购物车商品按产品编码构建映射,实现O(1)时间复杂度的查找:
public void addAllToCart(String wishListId) { // 通过ID获取心愿单,赋值给wishlist(WishListModel类型) // 获取会话购物车,赋值给cart(CartModel类型) // 将购物车条目按产品编码分组,便于快速查找 Map<String, AbstractOrderEntryModel> cartProductMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(cart.getEntries())) { for (AbstractOrderEntryModel entry : cart.getEntries()) { cartProductMap.put(entry.getProduct().getCode().toLowerCase(), entry); } } if (CollectionUtils.isNotEmpty(wishlist.getEntries())) { for (WishListEntryModel wishListEntry : wishlist.getEntries()) { String productCode = wishListEntry.getProduct().getCode().toLowerCase(); AbstractOrderEntryModel existingEntry = cartProductMap.get(productCode); if (existingEntry != null) { updateCartEntry(existingEntry.getEntryNumber(), wishListEntry.getQuantity() + existingEntry.getQuantity()); // 更新映射中的条目数量,避免后续操作使用旧数据 existingEntry.setQuantity(wishListEntry.getQuantity() + existingEntry.getQuantity()); } else { addToCart(wishListEntry); // 若addToCart执行后购物车条目立即更新,可同步将新条目放入映射 } } } }
说明
- 用HashMap关联购物车商品编码与条目,整体复杂度从O(n*m)降至O(n+m),适合购物车或心愿单条目较多的场景。
- 若
addToCart()执行后会立即更新购物车列表,可同步将新添加的条目放入映射,确保后续操作的准确性。
内容的提问来源于stack exchange,提问作者DEBAGNIK KAR
相关产品推荐
相关产品推荐

