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

时间:2011-01-15 20:27:45

标签: java performance hashmap

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

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());

3 个答案:

答案 0 :(得分:13)

方法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:

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

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

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

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

问题更新后,

编辑#1 更新

答案 1 :(得分:9)

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

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

从a的副本开始,替换或添加b。

中的所有键/值

答案 2 :(得分:2)

我认为您可以在线性时间内完成此操作,如下所示。让nm分别为ab中的元素数量。

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

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

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

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