Tengo un Map<String, ArrayList>
y un Set<String>
. ¿Hay alguna forma de "intersectar" las teclas del mapa con el conjunto de cadenas de modo que solo queden los pares con la clave dada permanezcan, sin iterar sobre todo el mapa? Mi principal preocupación es el rendimiento y reinventar la rueda en algo que se puede hacer de forma más elegante.Filtrar los elementos de un mapa basado en un subconjunto de sus claves sin iterar a través de todo
Q
Filtrar los elementos de un mapa basado en un subconjunto de sus claves sin iterar a través de todo
40
A
Respuesta
84
Just Do:
map.keySet().retainAll(set);
Según el javadoc, los cambios en el conjunto de claves se reflejan de nuevo en el mapa.
... El conjunto está respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto, y viceversa. ...
He aquí una demostración:
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}
5
Abundando en excelente respuesta de BalusC, los valores de() soporta retainAll(), así:
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 conserva valores duplicados, así, como era de esperar:
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}
Cuestiones relacionadas
- 1. Cómo filtrar claves de diccionario basado en sus valores correspondientes
- 2. Cómo filtrar elementos de un estándar :: mapa?
- 3. Iterar a través de un mapa con doseq
- 4. Cómo iterar a través de los elementos de una vista
- 5. Iterar todas las teclas de un mapa
- 6. Imprimir un subconjunto particular de claves en un diccionario
- 7. Cómo iterar a través de un fd_set
- 8. Usando DictWriter escribir un subconjunto de claves de un diccionario
- 9. ¿Cómo puedo iterar a través de elementos DOM en PHP?
- 10. Ordenación de las claves de diccionario basado en sus valores
- 11. Iterar a través de elementos en una enumeración en Delphi
- 12. yaml-cpp La manera más fácil de iterar a través de un mapa con valores indefinidos
- 13. ¿Cómo iterar a través de elementos hash, en un entorno R?
- 14. Google Filtrar: iterar sobre un diccionario JSON
- 15. eliminar elementos de un HashSet al iterar
- 16. Iterar a través de 2 listas
- 17. Copia de todos los elementos de un mapa a otro
- 18. iterar sobre un mapa y llamar a una función que borre otros elementos es el mapa
- 19. Cómo filtrar un mapa persistente en Clojure?
- 20. Iterar a través de un rango de Excel
- 21. eliminar elementos de un mapa sin ordenar Cumpliendo un predicado
- 22. matlab cómo iterar a través de todos los objetos en un área de trabajo
- 23. ¿La forma más simple de iterar a través de un Multiset en el orden de frecuencia de los elementos?
- 24. ¿Cómo puedo ordenar las claves de un mapa en Java?
- 25. Iterar a través de DataSet
- 26. Iterar a través de cada dígito en un número
- 27. Iterar a través de los componentes de pestaña en JTabbedPane
- 28. Cómo iterar a través de SAFEARRAY **
- 29. mysql, iterar a través de los nombres de columna
- 30. ¿Es posible tomar un "segmento" ordenado de un diccionario en Python basado en una lista de claves?
Wow. Nunca se supo que 'KeySet' era compatible con' retainAll'. Tan útil. –
usando colecciones desde 1.1 - y tampoco lo sabía. – javadba
Increíblemente útil. values () también lo admite. – Siddhartha