在ArrayList中搜索相同的对象并合并价格值而不是添加
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ArrayList中搜索相同的对象并合并价格值而不是添加相关的知识,希望对你有一定的参考价值。
我有一个子类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实现的。使用术语“首选组合继承”进行搜索以获取更多详细信息。 - 由于您不能在购物篮中拥有同一产品的多个实例,因此您应该使用HashSet而不是ArrayList。
- 而不是
existingProduct.setPrice(existingProduct.getPrice() + pr.getPrice());
你应该定义一个方法Product.adjustPrice并调用existingProduct.adjustPrice(pr.getPrice());
。搜索“告诉,不要问原则”。 - 在更高级的应用程序中 - 如果有可能从多个线程调整产品的价格 - 您将需要应用同步。我怀疑你在这个阶段需要走得那么远,但只是提到未来。
以上是关于在ArrayList中搜索相同的对象并合并价格值而不是添加的主要内容,如果未能解决你的问题,请参考以下文章
如何根据javascript中的键合并和替换两个数组中的对象?
在 ArrayList Java 的最后一个元素中查找对象 [重复]