根据内容删除List中的对象

时间:2014-04-29 05:13:55

标签: java list

我目前正在学习Java,我有一个棘手的问题,我无法回答...... 所以我开始开发一个购物车,有可能添加和删除项目,但后来我想到如果删除项目本身我要求删除创建相同方式的项目?解释:

ShoppingCart cart = new ShoppingCart();
Item.item = new Item("corn flakes", 500);
cart.addItem(item);
cart.removeItem(new Item("corn flakes", 500));
System.out.println(cart.itemCount()); // Supposed to display 0

好吧,如果我执行代码,它将显示“1”而不是“0”。

问题是我该如何让它发挥作用?

这是ShoppingCart的代码

` 公共类ShoppingCart {     列出项目;

public ShoppingCart() {
    this.items = new ArrayList<Item>();
}

public void addItem(Item item) {
    this.items.add(item);
}

public void removeItem(Item item) {
    this.items.remove(item);
}


public int itemCount() {
    return this.items.size();
}

public int totalPrice() {
    int sum = 0;
    for(Item item : items)
        sum += item.getPrice();
    return sum;
}   

} `

谢谢:)

2 个答案:

答案 0 :(得分:1)

如果没有看到ShoppingCart的底层实现,很难回答你。但我猜你将它存储在ArrayList中,如果是这样,你需要覆盖Item上的equals()然后在ArrayList上调用remove。目前,您的代码仅比较列表中项目的引用,因此创建新项目并尝试删除它将始终失败。

你需要做这样的事情

@Override
public boolean equals(Object that) {
    if(that == null || !(that instanceof Item))
        return false;
    return this.name.equals(that.name) && this.quantity == that.quantity;
}

答案 1 :(得分:1)

由于您似乎正在使用某种ShoppingCart支持ListList界面的文档似乎可以解答您的问题:

...removes the element with the lowest index i such that (o==null ? get(i)==null : o.equals(get(i))) (if such an element exists).

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#remove(java.lang.Object)

如果您正在使用remove(Object o)的{​​{1}}方法,则会在内部使用List,方法查找要删除的对象。但是,默认的equals()对象`是:

equals()' method for an

换句话说,它测试引用相等性 - 两个引用是否指向完全相同的对象。如果您未在public boolean equals(Object obj) { return (this == obj); } 课程中覆盖equals(),则这是您的支持Item用于查找要删除的元素的equals()方法。问题是,当您创建要删除的新List时,其引用指向与您放入的原始Item相同的变量;因此,Item方法找不到一个&#34;等于&#34;放入原始对象,因此不会删除任何内容。

长话短说,为了使其正常工作,您需要覆盖remove()来比较对象的内容,而不是对对象的引用。