Союз двух или более (хэш-карт)

У меня есть два Карты, которые содержат один и тот же тип объектов:

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

Я хочу получить список с: все значения в "Карта b" + все значения в "Карта a", которые не находятся в "Карта b".

Что такое самый быстрый способ выполнения этой операции?

Спасибо

EDIT: компарадирование выполняется с помощью id. Таким образом, два TaskJSO считаются равными, если они имеют один и тот же идентификатор (метод equals переопределяется).

Мое намерение состоит в том, чтобы узнать, какой самый быстрый способ выполнить эту операцию с точки зрения производительности. Например, есть ли разница, если я делаю "comparaison" на карте (как предложил Питер):

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

Теперь, что бы ни случилось... сравнение будет происходить с помощью equals. Таким образом, метод-1 вызовет equals для всех значений, а Method2 вызовет его на всех ключах. В зависимости от того, насколько сложным будет сравнение, производительность будет отличаться.

В методе 1 вам необходимо создать новый набор, но он гарантирует, что разные значения с одинаковыми ключами не будут перезаписаны. Но метод-2 является умным, если у вас есть уникальные идентификаторы.

Изменить # 1 обновление по мере обновления вопроса

Ответ 2

Если вы хотите, чтобы все ключи/значения из b плюс все значения в a, а не в b.

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

Запускает копию a и заменяет или добавляет все ключи/значения из b.

Ответ 3

Я думаю, вы можете сделать это в линейном времени следующим образом. Пусть n и m - число элементов в a и b соответственно.

  • Создайте новый HashSet, содержащий все значения из b. Время равно O (m).

  • Добавьте все значения из b в новый список. Время равно O (m).

  • Для каждого значения в a, проверьте, содержит ли HashSet значений в b этот элемент. Если да, ничего не делайте. В противном случае добавьте его в список. Время равно O (n).

Это заканчивается с использованием не более O (n + m) времени, которое является линейным.