web-dev-qa-db-fra.com

Filtrer les éléments d'une carte en fonction d'un sous-ensemble de ses clés sans itérer sur l'ensemble

J'ai un Map<String, ArrayList> et un Set<String>. Existe-t-il un moyen "d'intersecter" les clés de la carte avec l'ensemble de chaînes de sorte que seules les paires avec la clé donnée restent, sans itérer sur toute la carte? Ma principale préoccupation est la performance et la réinvention de la roue sur quelque chose de plus élégant.

51
dave

Faites juste:

map.keySet().retainAll(set);

Selon le javadoc , les changements dans le jeu de clés sont reflétés dans la carte.

... L'ensemble est soutenu par la carte, donc les modifications apportées à la carte sont reflétées dans l'ensemble, et vice-versa. ...

Voici une démo:

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}
114
BalusC

En élaborant l'excellente réponse de BalusC, values ​​() prend également en charge 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 conserve également les valeurs en double, comme vous pouvez vous y attendre:

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}
9
Siddhartha