计算地图中的类实例

时间:2017-03-16 11:05:58

标签: java hashmap

我有一个购物网站,其中的商品可以添加到购物篮中,每个商品都是产品类的实例,所有商品都存储在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);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

  

但是,每个产品仍然只列为一次,因为每个类实例都不同?

是。

HashMap使用hashcode()equals()的实现来识别密钥。

您要么使用已经正确实现两者的属性(建议使用@ zsmb13),要么在Product类中创建hashcode()equals()的实现(注意!执行继承它们!它们必须在一个体面的孩子身上实现,而这个孩子本身不会扩展......)。

答案 1 :(得分:0)

您需要覆盖产品类的equalshashCode,才能使基于哈希的操作正常运行。您需要类似这样的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;
        }
    }
}