Java: come convertire HashMap <String, Object> in array


Risposte:


191
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

modificare

Va notato che l'ordinamento di entrambi gli array potrebbe non essere lo stesso, vedere la risposta di oxbow_lakes per un approccio migliore all'iterazione quando è necessaria la coppia chiave / valori.


9
In realtà, questo codice non offre alcuna garanzia che hashMap.keySet (). ToArray () [0] sarà la chiave originale per hashMap.values ​​(). ToArray () [0] dalla mappa originale. Quindi questo è estremamente pericoloso
CrackerJack9

2
@ CrackerJack9 puoi spiegare?
Jake Wilson

12
Le chiavi non corrisponderanno ai loro valori nei due array.
Landon Kuhn

5
@Jakobud landon9720 è corretto ... l'ordine è psuedo-casuale e non è possibile garantire che la chiave [0] corrisponderà al valore [0] dopo aver convertito le chiavi in ​​a Sete i valori in a Collection. Sebbene siano tecnicamente convertiti in array (e rispondano alla tua domanda), il concetto di coppia chiave-valore è andato perso - motivo per cui questa è una risposta molto fuorviante (e pericolosa) ...
CrackerJack9

Posso attestare il pericolo di questo frammento di codice. Quando l'ho scritto, il mio terminale si è allungato e mi ha schiaffeggiato. Estremamente pericoloso! Attenzione!
artburkart

65

Se desideri le chiavi e i valori, puoi sempre farlo tramite entrySet:

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

Da ogni voce puoi (ovviamente) ottenere sia la chiave che il valore tramite i metodi getKeyegetValue


@ CrackerJack9 No, funziona. A differenza della soluzione accettata, questa mantiene le coppie chiave-valore. Ottieni {key, value}[]il contrario dikey[], value[]
Tobiq

51

Se hai HashMap<String, SomeObject> hashMapallora:

hashMap.values().toArray();

Tornerà un file Object[]. Se invece vuoi un array del tipo SomeObject, potresti usare:

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

3
Penso che intendi values()invece che keySet()per una serie di SomeObject.
Paul Bellora

4
Puoi anche migliorare le prestazioni specificando la dimensione dell'array in anticipo invece di utilizzare 0. Vedi esempio qui: stackoverflow.com/a/5061692/265877
Alex

@Alex "Nelle versioni precedenti di Java si consigliava di utilizzare un array pre-dimensionato (...) Tuttavia, poiché gli ultimi aggiornamenti di OpenJDK 6 questa chiamata è stata intrinseca, rendendo le prestazioni della versione dell'array vuoto uguali e talvolta anche migliori, rispetto al pre -sized version. Anche il passaggio di un array pre-dimensionato è pericoloso per una raccolta simultanea o sincronizzata poiché è possibile una corsa di dati tra la dimensione e la chiamata toArray, il che può comportare null aggiuntivi alla fine dell'array, se la raccolta è stata ridotta contemporaneamente durante l'operazione." - intellij
Amburgo è bella il

30

Per garantire l'ordine corretto per ogni matrice di chiavi e valori, utilizzare questo (le altre risposte utilizzano messaggi individuali Setche non offrono alcuna garanzia in merito all'ordine.

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++;
}

Perfetto! otteniamo sia la chiave che il valore, con i tipi di auto riempi eclipse, molto tempo cercando questo, grazie!
Aquarius Power

12

Un'alternativa al suggerimento di CrackerJacks, se desideri che HashMap mantenga l'ordine, potresti prendere in considerazione l'utilizzo di LinkedHashMap. Per quanto ne so, la sua funzionalità è identica a una HashMap ma è FIFO, quindi mantiene l'ordine in cui gli elementi sono stati aggiunti.


7

Ho usato quasi lo stesso di @kmccoy, ma invece di un l' keySet()ho fatto

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

Per entrare in un array di dimensioni.

    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++;
    }


Per entrare in un array a due dimensioni.

   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

Se stai utilizzando Java 8+ e hai bisogno di un bidimensionale Array, forse per i fornitori di dati TestNG, puoi provare:

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

Se le tue Objectsono se Stringhai bisogno di una String[][], prova:

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

0

Puoi provare anche questo.

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;
    }

Qui sto usando String come tipo di ritorno. Puoi cambiarlo nel tipo di ritorno richiesto da te.


1
la domanda riguarda HashMap()ma la tua soluzione riguarda Hashtable()... Ci sono alcune differenze tra loro
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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.