我有一个购物网站,其中的商品可以添加到购物篮中,每个商品都是产品类的实例,所有商品都存储在Collection<Product>
商品中,
我目前正在遍历该列表并在表格中显示每个项目。
但是我想为每个项目显示数量值。
我创建了一个Map
,并尝试将每个产品都放入其中。
但是每个产品仍然只列为一次,因为每个类实例都不同? 我该怎么调整呢?
我的产品类有产品ID值。这是我目前的代码。
Map<Product, Integer> map = new HashMap<>();
for (Product p : items) {
Integer i = map.get(p);
if (i == null) {
map.put(p, 1);
}
else {
map.put(p, i+1);
}
}
实现了hashcode和equals方法。
尝试将项目添加到地图中。
Collection<Product> items = basket.getItems();
Map<Product, Integer> map = new HashMap<>();
for (Product p : items) {
for (Product key : map.keySet()) {
if (p.equals(key)) {
map.put(key, map.get(key));
}
else {
map.put(p, 1);
}
}
}
答案 0 :(得分:1)
但是,每个产品仍然只列为一次,因为每个类实例都不同?
是。
HashMap
使用hashcode()
和equals()
的实现来识别密钥。
您要么使用已经正确实现两者的属性(建议使用@ zsmb13),要么在Product类中创建hashcode()
和equals()
的实现(注意!执行不继承它们!它们必须在一个体面的孩子身上实现,而这个孩子本身不会扩展......)。
答案 1 :(得分:0)
您需要覆盖产品类的equals
和hashCode
,才能使基于哈希的操作正常运行。您需要类似这样的Product类
class Product{
private int price;
private String name;
public Product(String itm, int pr){
this.name = itm;
this.price = pr;
}
public int hashCode(){
int hashcode = 0;
hashcode = price*20;
hashcode += name.hashCode();
return hashcode;
}
public boolean equals(Object obj){
if (obj instanceof Product) {
Product pp = (Product) obj;
return (pp.name.equals(this.name) && pp.price == this.price);
} else {
return false;
}
}
}