我目前正在学习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;
}
} `
谢谢:)
答案 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
支持List
,List
界面的文档似乎可以解答您的问题:
...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()
来比较对象的内容,而不是对对象的引用。