62 votes

Filtrez les éléments d'une carte en fonction d'un sous-ensemble de ses clés sans parcourir l'ensemble

J'ai un Map<String, ArrayList> et un Set<String> . Existe-t-il un moyen de "couper" 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 réinventer la roue sur quelque chose qui peut être fait avec plus d'élégance.

141voto

BalusC Points 498232

Faites juste :

 map.keySet().retainAll(set);

Conformément à la javadoc , les modifications apportées au jeu de clés sont répercutées 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}

13voto

Siddhartha Points 563

Élaborant sur l'excellente réponse de BalusC, values() prend également en charge 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 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}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X