我尝试使用两个java类实现购物车流程。一个是CartItem
,另一个是ShoppingCart
,其中包含购物车的所有流程。
这是我的CartItem
:
public class CartItem implements Serializable {
private int pro_id;
private int qnty;
public CartItem(int pro_id, int qnty) {
this.pro_id = pro_id;
this.qnty = qnty;
}
// getters and setters
....
// checking the item is already in the cart or not
public boolean isSameProduct(CartItem item) {
return this.pro_id == item.getPro_id();
}
我的ShoppingCart
课程:
public class ShoppingCart {
private CopyOnWriteArrayList<CartItem> itemList;
public ShoppingCart() {
this.itemList = new CopyOnWriteArrayList<CartItem>();
}
// adding item something wrong here I think..
public boolean addItem(CartItem item) {
boolean flag = false;
if (!this.itemList.isEmpty()) {
for (CartItem itm : this.itemList) {
if (itm.isSameProduct(item)) {
itm.setQnty(item.getQnty() + itm.getQnty());
flag = true;
break;
} else {
this.itemList.add(item);
flag = true;
break;
}
}
} else {
this.itemList.add(item);
flag = true;
}
return flag;
}
public void removeItem(int item_id) {
for (CartItem item : this.itemList) {
if (item.getPro_id() == item_id) {
this.itemList.remove(item);
}
}
}
以下是我添加产品和输出的方式:
ShoppingCart sc = new ShoppingCart();
sc.addItem(new CartItem(1, 1));
sc.addItem(new CartItem(1, 2));
sc.addItem(new CartItem(1, 3));
sc.addItem(new CartItem(1, 1));
sc.addItem(new CartItem(2, 1));
sc.addItem(new CartItem(2, 2));
sc.addItem(new CartItem(3, 4));
sc.addItem(new CartItem(3, 1));
// sc.removeItem(3);
for (CartItem item : sc.itemList) {
System.out.println("Item id - " + item.getPro_id() + " : Item Qnty - " + item.getQnty());
}
出放
Item id - 1 : Item Qnty - 7
Item id - 2 : Item Qnty - 1
Item id - 2 : Item Qnty - 2
Item id - 3 : Item Qnty - 4
Item id - 3 : Item Qnty - 1
但预期:
Item id - 1 : Item Qnty - 7
Item id - 2 : Item Qnty - 3
Item id - 3 : Item Qnty - 5
提前致谢。
答案 0 :(得分:1)
一旦你在购物车中有一个单品,你就不会在购物车中的第一个商品之后检查任何东西,因为你总是在循环浏览列表元素时破坏:
for (CartItem itm : this.itemList) {
if (itm.isSameProduct(item)) {
itm.setQnty(item.getQnty() + itm.getQnty());
flag = true;
break; // It was the same product; break.
} else {
this.itemList.add(item);
flag = true;
break; // It wasn't the same product; break.
}
}
相反,您需要使用flag
的值,并且仅在flag
为false时才添加该项:
public boolean addItem(CartItem item) {
boolean flag = false;
for (CartItem itm : this.itemList) {
if (itm.isSameProduct(item)) {
itm.setQnty(item.getQnty() + itm.getQnty());
flag = true;
break;
}
}
if (!flag) {
this.itemList.add(item);
flag = true;
}
return flag;
}