У меня есть Map<String, ArrayList>
и a Set<String>
. Есть ли способ "пересечь" ключи карты с набором строк, чтобы остались только пары с данным ключом, без повторения всей карты? Моя главная забота - это производительность и повторное изобретательство колеса на что-то, что можно сделать более элегантно.
Фильтрация элементов карты на основе поднабора ее ключей без повторения всего объекта
Ответ 1
Просто выполните:
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}
Ответ 2
Разрабатывая отличный ответ BalusC, значения() также поддерживают keepAll():
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}