Java: cómo convertir HashMap a la matriz

4 minutos de lectura

avatar de usuario
azúcar quemado

necesito convertir un HashMap<String, Object> a una matriz; alguien podria mostrarme como se hace?

  • ¿Quieres las claves, los valores o ambos?

    – Harto

    7 de julio de 2009 a las 5:47

avatar de usuario
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 un Collection. 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 a key[], 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

avatar de usuario
kmccoy

Si usted tiene HashMap<String, SomeObject> hashMap después:

hashMap.values().toArray();

devolverá un Object[]. Si en cambio quieres una matriz del tipo SomeObjectpodrías usar:

hashMap.values().toArray(new SomeObject[0]);

  • Creo que quieres decir values() en vez de keySet() para una matriz de SomeObject.

    – 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


avatar de usuario
galletajack9

Para garantizar el orden correcto de cada conjunto de claves y valores, use esto (las otras respuestas usan Sets 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.

avatar de usuario
Hugo Tavares

Usé casi lo mismo que @kmccoy, pero en lugar de un keySet() hice esto

hashMap.values().toArray(new MyObject[0]);

avatar de usuario
graham russell

Si está utilizando Java 8+ y necesita un 2 dimensional Arraytal 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 Objectson Strings y necesitas un String[][]probar:

map.entrySet()
    .stream()
    .map(e -> new String[]{e.getKey(), e.getValue().toString()})
    .toArray(String[][]::new);

¿Ha sido útil esta solución?