通过键减去两个HashMaps中的值的有效方法

时间:2011-04-26 14:56:10

标签: java hashmap

我想知道如何在键匹配时有效地减去两个映射的值。目前我有2 HashMap<String,Integer>并且这样做:

for (String key: map1.keySet()){
   if (map2.keySet().contains(key)){
       //subtract
   }
}

有更好的方法吗?

4 个答案:

答案 0 :(得分:5)

从理论上讲,除非你能以某种方式比O(n)方法更快地找到两个HashMap之间的匹配键,否则这个速度和它可以做的一样快。

  • 在第一张地图keySet()中迭代键 - O(n)
    • 查看密钥是否在其他地图中 - O(1)
    • 做你的手术 - O(1)

答案 1 :(得分:1)

意识到这是一个老线程但是从谷歌检查番石榴

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Maps

您可以使用Map.difference然后获取共同的条目,仅在左侧,右侧等。

答案 2 :(得分:0)

你考虑过使用Apache Commons Collections吗?

CollectionUtils.subtract( collection1, collection2 );

答案 3 :(得分:0)

我认为除非使用不同的方法和/或不同的数据结构,否则没有更好的方法。例如,您可以创建一个名为ValuePair的类,该类可以包含(最多)两个值,这两个值表示您当前存储在两个不同地图中的值,但您可以将所有对存储在一个地图中,以及何时它可以“减去”你可以在一组键中迭代。请注意,一对可能不完整,因此不会进行减法。

但这可能是矫枉过正的。