HashMaps中项目的频率

时间:2017-02-08 00:22:27

标签: java list hashmap

我一直在努力研究这段代码,我认为必定会有一些我看不到的东西。这是我的班级及其#34;添加"功能。添加应该更新List并向计数器提供信息。可悲的是,HashMap没有响应,而List则没有。有任何想法吗?谢谢!

public class Basket {

private List<Product> products;
private HashMap<Product, Integer> counter;

public Basket(){
    products = new LinkedList<Product>();
    counter = new HashMap<Product, Integer>();
}

public void add(Product product){
    products.add(product);
    for(Product key : counter.keySet()){
        if(product.getName() != key.getName()){
            counter.put(product, 1);
        }else{
            counter.put(product, counter.get(product) +1);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

我在您的代码中看到了两个问题

1)您使用!=比较字符串(两个产品名称),这是不正确的。您必须使用String.equals()或String.equalsIngoreCase()

2)每次迭代地图中的元素时,您也会尝试增加产品的计数器。我很确定你只想做一次。

通过这些修复,你可以做这样的事情。 (注意:我在这个解决方案中使用了一个标签,但它的功能与布尔标志相同。它只是确保你遍历地图中的每个元素并确保产品在添加之前不存在)

    public void add(Product product) {
        products.add(product);
        add: {
            for (Product key : counter.keySet()) {
                if (key.getName().equals(product.getName())) {
                    counter.put(key, counter.get(key) + 1);
                    break add;
                }
            }
            counter.put(product, 1);
        }
    }

但是,理想情况下,您将覆盖Product中的.equals()和.hashCode()方法,然后您就可以使用HashMap.containsKey()方法,如下所示:

    public void add(Product product) {
        products.add(product);
        if (counter.containsKey(product)) {
            counter.put(product, counter.get(product) + 1);
        } else {
            counter.put(product, 1);
        }
    }

使用三元组也可以进一步简化:

    public void add(Product product) {
        products.add(product);
        counter.put(product, counter.containsKey(product) ? counter.get(product) + 1 : 1);
    }

答案 1 :(得分:-1)

您不需要在循环中执行此操作 - auth.CurrentUser.UserId, "true" 等等。

如果你想要的只是检查if(product.getName() != key.getName())是否已经存在于地图中 -  如果不是,请将产品添加到地图中,并将计数器设置为1,如果是则将计数器增加1.

你可以这样做:

Product

if(counter.get(product) == null) counter.put(product,1); else counter.put(product, counter.get(product)+1); 类的默认hashCode()方法将确保它知道它是否是正在添加的重复Product对象。

get()方法将返回特定对的Product的值。

答案 2 :(得分:-1)

您的代码没有任何意义。您正在遍历密钥集,如果任何密钥不匹配,则表示您正在添加产品。您不需要遍历地图。看看吧:

public void add(Product product){
    products.add(product);
    Integer count = counter,get(product);
    if (count == null) {
        counter.put(product, 1);
    }else{
        counter.put(product, count+1);
    }
}

NB同步也是必需的。