Java: cómo convertir HashMap <String, Object> en matriz


Respuestas:


191
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.


9
En realidad, este código no ofrece ninguna garantía de que hashMap.keySet (). ToArray () [0] sea la clave original para hashMap.values ​​(). ToArray () [0] del mapa original. Así que esto es extremadamente peligroso
CrackerJack9

2
@ CrackerJack9, ¿puedes explicarme?
Jake Wilson

12
Las claves no se corresponderán con sus valores en las dos matrices.
Landon Kuhn

5
@Jakobud landon9720 es correcto ... el orden es pseudoaleatorio, y no se puede garantizar que la clave [0] corresponda al valor [0] después de convertir las claves en ay Setlos valores en a 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

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

65

Si desea las claves y los valores, siempre puede hacerlo a través de entrySet:

hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]

De cada entrada puede (por supuesto) obtener tanto la clave como el valor a través de los métodos getKeyygetValue


@ CrackerJack9 No, funciona. A diferencia de la solución aceptada, esta mantiene los pares clave-valor. Te {key, value}[]en contraposición akey[], value[]
Tobiq

51

Si tiene, HashMap<String, SomeObject> hashMapentonces:

hashMap.values().toArray();

Devolverá un Object[]. Si, en cambio, desea una matriz del tipo SomeObject, puede usar:

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

3
Creo que te refieres en values()lugar de keySet()a una variedad de SomeObject.
Paul Bellora

4
También puede mejorar el rendimiento especificando el tamaño de la matriz por adelantado en lugar de usar 0. Vea el ejemplo aquí: stackoverflow.com/a/5061692/265877
Alex

@Alex "En las versiones anteriores de Java, se recomendaba el uso de una matriz de tamaño predeterminado (...) Sin embargo, dado que las actualizaciones tardías de OpenJDK 6, esta llamada estaba intrinsificada, 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 la versión anterior. -sized version. También pasar una matriz pre-dimensionada es peligroso para una colección simultánea o sincronizada, ya que es posible una carrera de datos entre el tamaño y la llamada toArray, lo que puede resultar en nulos adicionales al final de la matriz, si la colección se redujo simultáneamente durante la operacion." - intellij
Hamburgo es agradable

30

Para garantizar el orden correcto para cada conjunto de claves y valores, use esto (las otras respuestas usan Sets individuales que no ofrecen 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++;
}

¡Perfecto! obtenemos tanto la clave como el valor, con tipos automáticos que se completan en eclipse, mucho tiempo buscando esto, ¡gracias!
Aquarius Power

12

Una alternativa a la sugerencia de CrackerJacks, si desea que HashMap mantenga el orden, podría considerar usar un LinkedHashMap en su lugar. Hasta donde yo sé, su funcionalidad es idéntica a un HashMap pero es FIFO, por lo que mantiene el orden en el que se agregaron los elementos.


7

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

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

6
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Object[][] twoDarray = new Object[map.size()][2];

Object[] keys = map.keySet().toArray();
Object[] values = map.values().toArray();

for (int row = 0; row < twoDarray.length; row++) {
    twoDarray[row][0] = keys[row];
    twoDarray[row][1] = values[row];
}

// Print out the new 2D array
for (int i = 0; i < twoDarray.length; i++) {
    for (int j = 0; j < twoDarray[i].length; j++) {
        System.out.println(twoDarray[i][j]);
    }
}

3

Para obtener una matriz de una dimensión.

    String[] arr1 = new String[hashmap.size()];
    String[] arr2 = new String[hashmap.size()];
    Set entries = hashmap.entrySet();
    Iterator entriesIterator = entries.iterator();

    int i = 0;
    while(entriesIterator.hasNext()){

        Map.Entry mapping = (Map.Entry) entriesIterator.next();

        arr1[i] = mapping.getKey().toString();
        arr2[i] = mapping.getValue().toString();

        i++;
    }


Para obtener una matriz de dos dimensiones.

   String[][] arr = new String[hashmap.size()][2];
   Set entries = hashmap.entrySet();
   Iterator entriesIterator = entries.iterator();

   int i = 0;
   while(entriesIterator.hasNext()){

    Map.Entry mapping = (Map.Entry) entriesIterator.next();

    arr[i][0] = mapping.getKey().toString();
    arr[i][1] = mapping.getValue().toString();

    i++;
}

2

Si está utilizando Java 8+ y necesita un Arrayproveedor de datos bidimensional , quizás para TestNG, puede probar:

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

Si sus Objects son Stringsy necesita una String[][], intente:

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

0

Puedes probar esto también.

public static String[][] getArrayFromHash(Hashtable<String,String> data){
        String[][] str = null;
        {
            Object[] keys = data.keySet().toArray();
            Object[] values = data.values().toArray();
            str = new String[keys.length][values.length];
            for(int i=0;i<keys.length;i++) {
                str[0][i] = (String)keys[i];
                str[1][i] = (String)values[i];
            }
        }
        return str;
    }

Aquí estoy usando String como tipo de retorno. Puede cambiarlo al tipo de devolución requerido por usted.


1
la pregunta es sobre HashMap()pero su solución es sobre Hashtable()... Hay algunas diferencias entre ellos
Choletski

0
@SuppressWarnings("unchecked")
    public static <E,T> E[] hashMapKeysToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        E[] temp;
        E typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getKey();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getKey();
            }
        }
        catch (Exception e)
        {
            return null;
        }
        return temp;
    }
//--------------------------------------------------------
    @SuppressWarnings("unchecked")
    public static <E,T> T[] hashMapValuesToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        T[] temp;
        T typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getValue();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (T[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getValue();
            }
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.