我有一个子类 BetterBasket ,可以访问超类 Basket 和一个ArrayList。我在BetterBasket中的方法“添加”添加了通过ArrayList搜索的项目,并且如果存在与该对象相同类型的对象,则必须将值添加到已经存在的对象中(合并“数量”和“价格”),否则必须添加该对象进入ArrayList。这是我的代码,但无法正常工作,因为它将根据需要添加产品,但不会合并相同的产品。因此,它不使用代码的else部分。我需要有人指出出什么问题了,因为看起来我已经正确地完成了所有工作,但缺少一小部分才能使它正常工作,我只是不知道自己在做错什么,并尝试了数百种不同的方法: / p>
@Override
public boolean add(Product pr)
{
if (!this.contains(pr)){ //if array doesn't contain the item
super.add(pr); //adds item
} else { //add item quantity and price to existing item.
double x = pr.getPrice();
int q = pr.getQuantity();
for (int i=0; i < super.size(); i++) //loop through array
{
if (super.get(i).equals(pr)){ //if item is same as item within
//the array
int w = super.get(i).getQuantity();
double y = super.get(i).getPrice();
super.get(i).setQuantity(q + w);
super.get(i).setPrice(y + x);
}
}
}
return true;
}
注意: 我以前使用过一些调试功能,但发现它甚至都不会进入else语句部分。 我应该在第一个IF语句中使用“ this”或“ super”吗? 为什么我的其他人没有被使用?
答案 0 :(得分:0)
从未选择else
分支的原因是因为contains
总是返回false
。造成这种情况的最可能原因是,您的组件元素Product
没有覆盖equals
和hashCode
:
public boolean contains(Object o)
:如果此列表包含指定的元素,则返回true。更正式地讲,当且仅当此列表包含至少一个元素(e == null?e == null:o.equals(e))时,返回true。 ArrayList.contains
另请参阅this post。
出于相同的原因,在equals
循环中使用for
也不太可能做您想要的事情。根据您的要求,看来HashMap
可能是更好的数据结构选择。
我们正在考虑使用using composition instead of inheritance来访问ArrayList
功能,这是一个好主意。使用浮点类型表示货币也是not recommended。