簡體   English   中英

兩個或更多(哈希)映射的聯合

[英]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中的所有鍵/值。

我想你可以在線性時間內做到這一點,如下所示。 nm分別為ab的元素數。

  1. 創建一個包含b中所有值的新HashSet 時間是O(m)。

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

  3. 對於中的每個值a ,檢查是否HashSet值的b含有該元素。 如果是這樣,什么也不做。 否則,將其添加到列表中。 時間是O(n)。

這最終使用不超過O(n + m)的時間,這是線性的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM