[英]Union of two or more (hash)maps
我有兩個包含相同類型對象的地圖:
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:
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()
現在,無論是什么情況......比較將使用equals
。 因此,Method-1將在所有值上調用equals
,Method2將在所有鍵上調用它。 根據比較的復雜程度,性能會有所不同。
在方法1中,您需要創建一個新的Set,但它確保具有相同鍵的不同值不會被覆蓋。 但是如果你有唯一的ID,方法2很聰明。
問題更新后編輯#1更新
如果你想要b中的所有鍵/值加上a中的所有值,而不是b中的所有值。
Map<String, TaskJSO> ab = new HashMap<String, TaskJSO>(a);
ab.putAll(b);
從a的副本開始,替換或添加b中的所有鍵/值。
我想你可以在線性時間內做到這一點,如下所示。 設n
和m
分別為a
和b
的元素數。
創建一個包含b
中所有值的新HashSet
。 時間是O(m)。
將b
中的所有值添加到新列表中。 時間是O(m)。
對於中的每個值a
,檢查是否HashSet
值的b
含有該元素。 如果是這樣,什么也不做。 否則,將其添加到列表中。 時間是O(n)。
這最終使用不超過O(n + m)的時間,這是線性的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.