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.