两个或更多(哈希)映射的联合

我有两个包含相同类型对象的地图:

Map a = new HashMap(); Map b = new HashMap(); public class TaskJSO { String id; } 

地图键是“id”属性。

 a.put(taskJSO.getId(), taskJSO); 

我想获得一个列表:“Map b”中的所有值+“Map a”中不在“Map b”中的所有值。

执行此操作的最快方法是什么?

谢谢

编辑:比较由id完成。 因此,如果两个TaskJSO具有相同的id(等于方法被覆盖),则认为它们是相等的。

我的目的是从性能的角度来了解哪种方法最快。 例如,如果我在地图中执行“比较”(如彼得所建议的),是否有任何区别:

 Map ab = new HashMap(a); ab.putAll(b); ab.values() 

或者如果我使用一套(如Nishant所建议的):

 Set s = new Hashset(); s.addAll(a.values()); s.addAll(b.values()); 

方法1:

  Set s = new HashSet(); s.addAll(a.values()); s.addAll(b.values()); 

Set是唯一对象的集合。 请参阅: http : //download.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html


方法2:

这将比较键,如果找到相同的键 – 该值将被后面的Map的值覆盖。

 Map ab = new HashMap(a); ab.putAll(b); ab.values() 

现在,无论是什么情况……比较将使用equals 。 因此,Method-1将在所有值上调用equals ,Method2将在所有键上调用它。 根据比较的复杂程度,性能会有所不同。

在方法1中,您需要创建一个新的Set,但它确保具有相同键的不同值不会被覆盖。 但是如果你有唯一的ID,方法2很聪明。

问题更新后编辑#1更新

如果你想要b中的所有键/值加上a中的所有值,而不是b。

 Map ab = new HashMap(a); ab.putAll(b); 

从a的副本开始,替换或添加b中的所有键/值。

我想你可以在线性时间内做到这一点,如下所示。 设nm分别为ab的元素数。

  1. 创建一个包含b中所有值的新HashSet 。 时间是O(m)。

  2. b中的所有值添加到新列表中。 时间是O(m)。

  3. 对于a中的每个值,检查b中值的HashSet是否包含该元素。 如果是这样,什么也不做。 否则,将其添加到列表中。 时间是O(n)。

这最终使用不超过O(n + m)的时间,这是线性的。