Союз двух или более (хэш-карт)
У меня есть два Карты, которые содержат один и тот же тип объектов:
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) времени, которое является линейным.