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

116

Necesito convertir HashMap<String, Object>a en una matriz; ¿Alguien podría mostrarme cómo se hace?

azúcar quemado
fuente
4
¿Quieres las claves, los valores o ambos?
harto

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.

Landon Kuhn
fuente
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

oxbow_lakes
fuente
@ 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]);
kmccoy
fuente
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++;
}
CrackerJack9
fuente
¡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.

Dean Wild
fuente
7

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

hashMap.values().toArray(new MyObject[0]);
Hugo Tavares
fuente
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]);
    }
}
valeriana
fuente
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++;
}
Mitul Maheshwari
fuente
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);
Graham Russell
fuente
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.

Mayur
fuente
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;
    }
Ali Bagheri
fuente
0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
Рома Иртов
fuente