ejemplo - entry java example
Convierta Set<Map.Entry<K, V>> a HashMap<K, V> (5)
No hay una API incorporada en Java para la conversión directa entre HashSet
y HashMap
, necesita iterar a través del conjunto y usar el relleno de Entry
en el mapa.
una aproximación:
Map<Integer, String> map = new HashMap<Integer, String>();
//fill in map
Set<Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet = new HashMap<Integer, String>();
for(Entry<Integer, String> entry : set)
{
mapFromSet.put(entry.getKey(), entry.getValue());
}
Aunque cuál es el propósito aquí, si realiza algún cambio en Set
que también se reflejará en Map
como conjunto devuelto por Map.entrySet
es copia de seguridad por Map
. Ver javadoc
continuación:
Establecer <Entry <Integer, String >> java.util.Map.entrySet ()
Devuelve una vista de Conjunto de las asignaciones contenidas en este mapa. El conjunto está respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto y viceversa. Si el mapa se modifica mientras una iteración sobre el conjunto está en progreso (excepto a través de la propia operación de eliminación del iterador, o mediante la operación setValue en una entrada de mapa devuelta por el iterador) los resultados de la iteración no están definidos. El conjunto admite la eliminación de elementos, que elimina la asignación correspondiente del mapa, a través de Iterator.remove, Set.remove, removeAll, retainAll y operaciones claras. No admite agregar o agregar todas las operaciones.
En un punto de mi código, creé un Set<Map.Entry<K, V>>
desde un mapa. Ahora quiero volver a crear el mismo formulario de mapa, por lo que quiero convertir el HashSet<Map.Entry<K, V>>
nuevo en un HashMap<K, V>
. ¿Java tiene una llamada nativa para hacer esto, o tengo que recorrer los elementos establecidos y construir el mapa manualmente?
En Java 8 con combinador correcto
Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet =set.stream().collect(HashMap::new,(t, u) -> t.put(u.getKey(), u.getValue()),
(Map mapToReturn, Map otherMap) ->
{
otherMap.entrySet().forEach((Map.Entry entry) -> {
mapToReturn.put(entry.getKey(),entry.getValue());
});
return mapToReturn;}););
Una solución Java 8 bastante corta. Puede lidiar con llaves duplicadas.
Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet = set.stream().collect(Collectors.toMap(Entry::getKey,
Entry::getValue,
(a,b)->b));
Editar: gracias a shmosel que merece más crédito que yo por esto
A partir de Guava 19 puede usar ImmutableMap.copyOf(Iterable<Map.Entry<K,V>>)
Solución Java-8 más simple que involucra a Collectors.toMap
:
Map<Integer, String> mapFromSet = set.stream()
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Se IllegalStateException
una IllegalStateException
si se encuentra una clave duplicada.