两个HashMap中按键减法的高效方法

3
我想知道如何在两个具有相同键的Map中高效地执行值的减法。目前我有两个HashMap<String,Integer>,我是这样做的:
for (String key: map1.keySet()){
   if (map2.keySet().contains(key)){
       //subtract
   }
}

有没有更好的方法来做这件事?

2
对于"subtract",你是指删除map1中与map2相同的所有内容,还是执行具有相同键的值之间的算术减法运算? - gd1
不太确定您所说的“减去”是什么意思:您是将结果写入第三个映射吗?还是更改第一个或第二个映射?另外,键的性质是什么?它们具有可比性吗? - Dilum Ranatunga
我所说的减法是指:如果我有一个(“Test”,6)和一个(“Test”,2),我想把我的(“Test”,4)(6-2)放在另一个映射中。键是字符串。 - AndaP
4个回答

5

理论上讲,这是最快的方法,除非你能以快于O(n)的方式找到两个HashMap之间匹配的键。

  • 遍历第一个map的keySet()中的键 - O(n)
    • 查看键是否在另一个map中 - O(1)
    • 执行操作 - O(1)

你可以通过迭代较小的那个映射来进行一些优化。 - Paŭlo Ebermann
@Paŭlo 嗯,这是一个很好的观点,对于较小的集合或其中一个集合与另一个相差一个数量级的情况尤其重要。但从严格的理论(大O)角度来看,这并不重要。 - Daniel DiPaolo
是的,现在我想起来了,似乎这就是最快的速度了。谢谢! - AndaP

1

0

我认为除非您使用不同的方法和/或不同的数据结构,否则没有更好的方法。例如,您可以创建一个名为ValuePair的类,该类可以包含(最多)两个值,这些值代表您当前存储在两个不同映射中的值,但您可以将所有对存储在单个映射中,并且当涉及“减法”时,您可以在单个键集中进行迭代。请注意,一对可以是不完整的,因此不执行任何减法。

但那可能有点过头了。


-1

你考虑过使用Apache Commons Collections吗?

CollectionUtils.subtract( collection1, collection2 );

如果我没记错的话,这个操作将从一个集合中减去另一个集合,而不是减去拥有相同键的集合元素。 - Daniel DiPaolo
@Daniel:不是很清楚。因为Liv给出了一个合理的答案,所以我点了赞。 - gd1
1
@alpian:我也是这样理解的。但是Liv的解释并不完全超出范围,值得尊重。 - gd1
2
我认为这个问题非常清楚。此外,Map甚至没有扩展Collection接口,因此这个答案显然是错误的。 - z7sg Ѫ
@Giacomo: http://meta.stackexchange.com/questions/87487/sympathy-upvotes-revisited-what-should-i-do - z7sg Ѫ
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接