我有一个子类BetterBasket
,可以访问超类Basket
和ArrayList<Product>
。我在add
中的方法BetterBasket
应该搜索ArrayList
,如果有一个相同类型的对象,则必须将值添加到已存在的对象中,否则必须将对象添加到ArrayList
中。到目前为止我的代码看起来像这样:
@Override
public boolean add( Product pr )
{
super.add(pr);
double x = pr.getPrice();
for (int i=0; i < super.size(); i++) {
if (super.get(i).equals(pr)) {
double y = super.get(i).getPrice();
super.get(i).setPrice(y + x);
}
}
// Collections.sort to sort ArrayList from highest to lowest product number
(I have removed the code for this)
return true;
}
}
当我运行它时,该对象被添加到ArrayList
但价格也加倍。我尝试了许多不同的变化但没有成功。任何提示或建议将不胜感激。
编辑:
if (!super.contains(pr)) {
super.add(pr);
} else {
for (int i=0; i < super.size(); i++) {
if (super.get(i).equals(pr)) {
double y = super.get(i).getPrice();
super.get(i).setPrice(y + x);
}
}
}
现在它将每个对象添加到arraylist,即使有两倍。
假设您的Product类定义如下:
class Product {
final int id; // Primary key
String name;
double price; // Should really be using BigDecimal but it's only an exercise
public Product(int id) {
this.id = id;
}
// Getters and setters follow...
}
然后你需要编写一个equals()方法:
class Product {
final int id; // Primary key
String name;
double price; // Should really be using BigDecimal but it's only an exercise
@Override
publc boolean equals(Object o) {
if (!(o instanceOf Product))
return false;
if (this == o)
return true;
return id == o.id;
}
@Override
publc int hashCode() {
return id;
}
// The rest...
}
然后你现有的代码应该工作(它依赖于我怀疑是一个缺少equals方法),但你可以缩短它:
@Override
public boolean add(Product pr) {
int index = indexOf(pr);
if (index >= 0) {
Product existingProduct = get(index);
existingProduct.setPrice(existingProduct.getPrice() + pr.getPrice());
} else {
add(pr);
}
return true;
}
顺便提一下,还有一些建议:
ArrayList<Product>
派生你的篮子课程。相反,将您的列表保存在private final List<Product> products = new ArrayList<>();
中。你的篮子不是一个真正的ArrayList。如果是,那就意味着你可以将一个篮子传递给任何带有ArrayList的杂项方法。您的购物篮是根据ArrayList实现的。使用术语“首选组合继承”进行搜索以获取更多详细信息。existingProduct.setPrice(existingProduct.getPrice() + pr.getPrice());
你应该定义一个方法Product.adjustPrice并调用existingProduct.adjustPrice(pr.getPrice());
。搜索“告诉,不要问原则”。