【发布时间】:2013-08-15 14:59:05
【问题描述】:
我有一些 bean 类型(产品)的列表,我需要从我的列表中找到重复的产品,假设我的 bean Products 包含像这样的 getter 和 setter
public class Product {
private int id;
private String name;
private BigDecimal cost;
private int uniqueAssignedId;
public Product(int id, String name, BigDecimal cost, int uniqueAssignedId) {
this.id = id.....
}
public int getId() {
return this.id;
}
//The rest of getters and setters.
我正在尝试将此列表放入地图中以查找重复的“id”值,但它没有按预期工作,问题是我的列表是已售产品的列表(抱歉冗余)所以每个售出的产品都有一个唯一的 uniqueAssignedId 因此对象总是不同的,假设我的列表填充如下:
listProducts.add(5, "Soda", 1.00, 1);
listProducts.add(3,"Phone", 300.00, 2);
listProducts.add(4, "Cofee", 5.00, 3);
listProducts.add(5, "Soda", 1.00, 4);
listProducts.add(4, "Cofee", 5.00, 5);
listProducts.add(5, "Soda", 1.00, 6);
(我知道我必须创建一个对象 Product product = new Product() 并用 setter 填充它,然后将对象添加到我的列表中,但这更简单)
到目前为止我所尝试的:
Set<Product> uniqueId = new HashSet<Product>(listProducts);
for (Product product : uniqueId) {
System.out.println("The product with id "+product.getId+" was repeated: "
+ Collections.frequency(listProducts, product.getId));
}
但它总是迭代 6 次而不是 3 次(3 是我销售的不同产品的数量)。那么我怎样才能让 Hashset 只得到不同的 id 呢?我应该使用地图吗?任何线索将不胜感激。
【问题讨论】:
-
你是否在
Product类中重写了equals和hashcode方法? -
我没有尝试过,因为我真的不知道该怎么做,我已经阅读了如何覆盖方法但我根本不明白。
-
没关系,当我创建我的 Bean 时,Netbeans 会自动覆盖等号和哈希码,但正如我告诉你的,我不知道如何处理它:/
-
IMO,将
uniqueAssignedId添加到Product并不是很好的设计方式。并且将Productsequals和hashCode方法基于该字段是没有意义的。您可能希望使用uniqueAssignedId和product字段创建另一个类SoldProduct。它的equals和hashCode可以基于该id字段。 -
发布你的 equals 和 hashcode 方法。如果它们在比较中包含 uniqueAssignedId,则两个产品永远不会相等。