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

116

Ich muss a HashMap<String, Object>in ein Array konvertieren . Kann mir jemand zeigen, wie es geht?

gebrannter Zucker
quelle
4
Sie wollen die Schlüssel, die Werte oder beides?
Harto

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.

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

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

Dean Wild
quelle
7

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

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

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