购物车不会从第二次尝试开始更新数量

时间:2015-12-21 14:35:38

标签: java list generics arraylist copyonwritearraylist

我尝试使用两个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

提前致谢。

1 个答案:

答案 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;
}