Java: So konvertieren Sie HashMap <String, Object> in ein Array


Antworten:


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

Bearbeiten

Es sollte beachtet werden, dass die Reihenfolge beider Arrays möglicherweise nicht gleich ist. Siehe oxbow_lakes Antwort für einen besseren Ansatz für die Iteration, wenn der Paarschlüssel / die Paarwerte benötigt werden.


9
Tatsächlich bietet dieser Code keine Garantie dafür, dass hashMap.keySet (). ToArray () [0] der ursprüngliche Schlüssel für hashMap.values ​​(). ToArray () [0] aus der ursprünglichen Map ist. Das ist also extrem gefährlich
CrackerJack9

2
@ CrackerJack9 kannst du das erklären?
Jake Wilson

12
Die Schlüssel entsprechen nicht ihren Werten in den beiden Arrays.
Landon Kuhn

5
@Jakobud landon9720 ist korrekt ... die Reihenfolge ist pseudozufällig und es kann nicht garantiert werden, dass Schlüssel [0] dem Wert [0] entspricht, nachdem Sie die Schlüssel in a Setund die Werte in a konvertiert haben Collection. Während sie technisch in Arrays konvertiert sind (und Ihre Frage beantworten), ist das Konzept des Schlüssel-Wert-Paares verloren gegangen - weshalb dies eine sehr irreführende (und gefährliche) Antwort ist ...
CrackerJack9

Ich kann die Gefahr dieses Code-Snippets bestätigen. Als ich es schrieb, streckte mein Terminal die Hand aus und schlug mich. Extrem gefährlich! In acht nehmen!
artburkart

65

Wenn Sie die Schlüssel und Werte möchten, können Sie dies jederzeit über Folgendes tun entrySet:

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

Von jedem Eintrag können Sie (natürlich) sowohl den Schlüssel als auch den Wert über die Methoden getKeyund getValueabrufen


@ CrackerJack9 Nein, es funktioniert. Im Gegensatz zur akzeptierten Lösung werden hier die Schlüssel-Wert-Paare beibehalten. Sie erhalten {key, value}[]im Gegensatz zukey[], value[]
Tobiq

51

Wenn Sie HashMap<String, SomeObject> hashMapdann haben:

hashMap.values().toArray();

Wird eine zurückgeben Object[]. Wenn Sie stattdessen ein Array des Typs möchten SomeObject, können Sie Folgendes verwenden:

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

3
Ich denke du meinst values()statt keySet()für eine Reihe von SomeObject.
Paul Bellora

4
Sie können die Leistung auch verbessern, indem Sie die Array-Größe im Voraus angeben,
Alex

@Alex "In älteren Java-Versionen wurde die Verwendung eines Arrays mit Vorgröße empfohlen (...). Da jedoch spätere Aktualisierungen von OpenJDK 6 durchgeführt wurden, war dieser Aufruf untrennbar miteinander verbunden, sodass die Leistung der Version mit leerem Array im Vergleich zur Vorversion gleich und manchmal sogar noch besser war -sized version. Auch das Übergeben eines vorgroßen Arrays ist für eine gleichzeitige oder synchronisierte Sammlung gefährlich, da ein Datenrennen zwischen der Größe und dem toArray-Aufruf möglich ist, was zu zusätzlichen Nullen am Ende des Arrays führen kann, wenn die Sammlung währenddessen gleichzeitig verkleinert wurde die Operation." - Intellij
Hamburg ist schön

30

Verwenden Sie diese Option, um die richtige Reihenfolge für jedes Array von Schlüsseln und Werten zu gewährleisten (bei den anderen Antworten werden Personen verwendet, Setdie keine Garantie für die Bestellung bieten.

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

perfekt! Wir bekommen sowohl Schlüssel als auch Wert, mit automatischen Typen, die die Sonnenfinsternis ausfüllen, und lange danach suchen, danke!
Wassermann Macht

12

Eine Alternative zum Vorschlag von CrackerJacks. Wenn Sie möchten, dass die HashMap die Reihenfolge beibehält, können Sie stattdessen eine LinkedHashMap verwenden. Soweit mir bekannt ist, ist die Funktionalität identisch mit einer HashMap, es handelt sich jedoch um FIFO, sodass die Reihenfolge beibehalten wird, in der Elemente hinzugefügt wurden.


7

Ich habe fast das gleiche wie @kmccoy verwendet, aber stattdessen habe keySet()ich dies getan

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

In ein eindimensionales Array gelangen.

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


Um in ein zweidimensionales Array zu gelangen.

   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

Wenn Sie Java 8+ verwenden und eine zweidimensionale Version benötigen Array, möglicherweise für TestNG-Datenanbieter, können Sie Folgendes versuchen:

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

Wenn Ihr Objects Strings ist und Sie ein benötigen String[][], versuchen Sie:

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

0

Sie können dies auch versuchen.

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

Hier verwende ich String als Rückgabetyp. Sie können es in den von Ihnen gewünschten Rückgabetyp ändern.


1
Die Frage ist ungefähr, HashMap()aber Ihre Lösung ist ungefähr Hashtable()... Es gibt einige Unterschiede zwischen ihnen
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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.