我正在生成HashMap,我想通过将它们放在另一个HashMap中来跟踪我生成的每种HashMaps的数量<的HashMap<字符串,整数>,整数>其中值是频率。
我的代码如下所示:
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中。我错过了什么?
答案 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 );
}
在此之后,集合映射将包含散列图及其出现频率。