Фильтруйте элементы карты на основе подмножества ее ключей, не просматривая всю вещь - PullRequest
51 голосов
/ 19 июля 2011

У меня есть Map<String, ArrayList> и Set<String>.Есть ли способ «пересечь» ключи карты с набором строк так, чтобы остались только пары с данным ключом, без итерации по всей карте?Мое главное беспокойство - производительность и переизобретение колеса на что-то, что можно сделать более элегантно.

Ответы [ 2 ]

113 голосов
/ 19 июля 2011

Просто выполните:

map.keySet().retainAll(set);

Согласно javadoc , изменения в наборе ключей отражаются обратно на карте.

..Набор опирается на карту, поэтому изменения в карте отражаются в наборе, и наоборот....

Вот демоверсия:

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("1");
set.add("3");

map.keySet().retainAll(set);

System.out.println(map); // {3=three, 1=one}
9 голосов
/ 12 февраля 2016

Обрабатывая отличный ответ BalusC, values ​​() также поддерживает retainAll ():

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);   // prints {1=one, 2=two}

retailAll также сохраняет повторяющиеся значения, как и следовало ожидать:

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "two");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);  // prints {1=one, 2=two, 4=two}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...