两个或多个(哈希)映射的并集

2022-09-04 07:51:52

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

Map<String, TaskJSO> a = new HashMap<String, TaskJSO>();
Map<String, TaskJSO> b = new HashMap<String, TaskJSO>();

public class TaskJSO { String id; }

映射键是“id”属性。

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

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

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

谢谢

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

我的目的是从性能的角度来看,知道哪种是执行此操作的最快方法。例如,如果我在地图中做“比较”有什么区别(如彼得所建议的那样):

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
ab.values()

或者如果我使用一个集合(如Nishant所建议):

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

答案 1

方法 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<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
ab.values()

现在,无论情况如何...将使用 进行比较。因此,方法 1 将调用所有值,方法 2 将在所有键上调用它。根据比较的复杂程度,性能会有所不同。equalsequals

在方法 1 中,您需要创建一个新的 Set,但它可确保具有相同键的不同值不会过度定义。但是方法-2是聪明的,如果你有唯一的ID。

编辑#1更新,因为问题已更新


答案 2

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

Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);

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


推荐