azúcar quemado
necesito convertir un HashMap<String, Object>
a una matriz; alguien podria mostrarme como se hace?
Landon Kuhn
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values
Editar
Cabe señalar que el orden de ambas matrices puede no ser el mismo. Consulte la respuesta de oxbow_lakes para obtener un mejor enfoque para la iteración cuando se necesitan los pares clave/valores.
-
En realidad, este código no ofrece ninguna garantía de que hashMap.keySet().toArray()[0] será la clave original para hashMap.values().toArray()[0] del Mapa original. Así que esto es extremadamente peligroso
– CrackerJack9
7 ago 2011 a las 18:20
-
@ CrackerJack9, ¿puedes explicarlo?
–JakeWilson
2 de noviembre de 2011 a las 15:27
-
Las claves no corresponderán a sus valores en las dos matrices.
– Landon Kuhn
2 de noviembre de 2011 a las 18:50
-
@Jakobud landon9720 es correcto… el orden es pseudoaleatorio y no se puede garantizar esa clave[0] corresponderá al valor[0] después de convertir las claves a un
Set
y los valores a unCollection
. Si bien técnicamente se convierten en matrices (y responde a su pregunta), el concepto del par clave-valor se ha perdido, por lo que esta es una respuesta muy engañosa (y peligrosa)….– CrackerJack9
3 de noviembre de 2011 a las 6:43
-
Puedo dar fe del peligro de este fragmento de código. Cuando lo escribí, mi terminal se acercó y me abofeteó. ¡Extremadamente peligroso! ¡Tener cuidado!
– artburkart
3 de mayo de 2020 a las 13:28
Si desea las claves y los valores, siempre puede hacerlo a través de la entrySet
:
hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]
De cada entrada puede (por supuesto) obtener tanto la clave y valor a través de la getKey
y getValue
métodos
-
@ CrackerJack9 No, funciona. A diferencia de la solución aceptada, esta mantiene los pares clave-valor. Usted obtiene
{key, value}[]
Opuesto akey[], value[]
– Tobiq
26 de agosto de 2019 a las 11:28
-
Esta parece una mejor solución.
– Damola Obaleke
8 de enero a las 8:07
kmccoy
Si usted tiene HashMap<String, SomeObject> hashMap
después:
hashMap.values().toArray();
devolverá un Object[]
. Si en cambio quieres una matriz del tipo SomeObject
podrías usar:
hashMap.values().toArray(new SomeObject[0]);
-
Creo que quieres decir
values()
en vez dekeySet()
para una matriz deSomeObject
.– Pablo Bellora
8 de febrero de 2012 a las 4:33
-
@Alex “En versiones anteriores de Java, se recomendaba usar una matriz de tamaño predeterminado (…) Sin embargo, desde las actualizaciones tardías de OpenJDK 6, esta llamada se intrínseco, lo que hace que el rendimiento de la versión de matriz vacía sea el mismo y, a veces, incluso mejor, en comparación con el pre También es peligroso pasar una matriz de tamaño predeterminado para una colección concurrente o sincronizada, ya que es posible una carrera de datos entre el tamaño y la llamada toArray, lo que puede generar valores nulos adicionales al final de la matriz, si la colección se redujo al mismo tiempo durante la operacion.” – inteligencia
– Hamburgo es agradable
14/09/2019 a las 22:46
galletajack9
Para garantizar el orden correcto de cada conjunto de claves y valores, use esto (las otras respuestas usan Set
s que no ofrecen ninguna garantía en cuanto al pedido.
Map<String, Object> map = new HashMap<String, Object>();
String[] keys = new String[map.size()];
Object[] values = new Object[map.size()];
int index = 0;
for (Map.Entry<String, Object> mapEntry : map.entrySet()) {
keys[index] = mapEntry.getKey();
values[index] = mapEntry.getValue();
index++;
}
Una alternativa a la sugerencia de CrackerJacks, si desea que HashMap mantenga el orden, podría considerar usar un LinkedHashMap en su lugar. Por lo que sé, su funcionalidad es idéntica a HashMap pero es FIFO, por lo que mantiene el orden en que se agregaron los elementos.
Hugo Tavares
Usé casi lo mismo que @kmccoy, pero en lugar de un keySet()
hice esto
hashMap.values().toArray(new MyObject[0]);
graham russell
Si está utilizando Java 8+ y necesita un 2 dimensional Array
tal vez para los proveedores de datos de TestNG, puede probar:
map.entrySet()
.stream()
.map(e -> new Object[]{e.getKey(), e.getValue()})
.toArray(Object[][]::new);
Si tu Object
son String
s y necesitas un String[][]
probar:
map.entrySet()
.stream()
.map(e -> new String[]{e.getKey(), e.getValue().toString()})
.toArray(String[][]::new);
¿Quieres las claves, los valores o ambos?
– Harto
7 de julio de 2009 a las 5:47