的HashMap&LT; HashMap <string,integer>,Integer&gt;跟踪集合</string,integer>

时间:2015-01-18 08:11:27

标签: java hashmap comparator

我正在生成HashMap,我想通过将它们放在另一个HashMap中来跟踪我生成的每种HashMaps的数量&lt;的HashMap&LT;字符串,整数&gt;,整数&gt;其中值是频率。

我的代码如下所示:

HashMap< HashMap<String,Integer>,Integer> myHashmaps = new HashMap< HashMap<String,Integer> , Integer>();
for(int i = 0; i < 200; i++){
    HashMap<String, Integer> generatedMap = generateHashMap();
    if(myHashmaps.containsValue(generatedMap)){
         sets.put(generatedMap, myHashmaps.get(generatedMap) + 1 );
    }else{
         myHashmaps.put(generatedMap,1 );
    }
}

在循环结束后,我将从myHashmaps中打印出最常出现的hashmap。

我遇到的问题是生成的具有相同键和集的哈希映射多次出现在myHashmaps中。我错过了什么?

2 个答案:

答案 0 :(得分:0)

由于您使用HashMap作为密钥,因此您应该更改:

if(myHashmaps.containsValue(generatedMap)){

if(myHashmaps.containsKey(generatedMap)){

这仍然无法解释为什么你会看到generated hashmaps with the same keys and sets are showing up in myHashmaps multiple times。如果HashMap所有条目相等,则HashMap等于另一个hashCode,这意味着它们的所有键/值对都相等。如果每个键的值不相等,则具有完全相同键的两个映射仍然被认为彼此不同。您应该检查您认为多次出现的地图是否具有完全相同的键和值。

您还应该注意,如果更改在外部Map中用作键的任何内部地图,外部HashMap将不会根据{{1}}的新值计算该键的新bin,因此,您可能会在外部地图中遇到两个相同键的情况。这是一个很好的理由不使用HashMap(或任何可变对象)作为HashMap的关键。

答案 1 :(得分:0)

您正在使用myHashmaps.containsValue(generatedMap)。这样做是检查哈希映射是否包含generateMap作为Value而不是Key。这永远不会返回True,因为所有值都是Integer类型(例如1),这永远不会等于Hashmap。

由于这个原因,if条件永远不会为真,这将导致每次都执行myHashmaps.put(generatedMap,1)。将containsValue替换为containsKey。

if(myHashmaps.containsKey(generatedMap)){
         sets.put(generatedMap, myHashmaps.get(generatedMap) + 1 );
    }else{
         myHashmaps.put(generatedMap,1 );
    }

在此之后,集合映射将包含散列图及其出现频率。