2009-07-07 7 views

Antwort

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

bearbeiten

zu beachten, dass die Reihenfolge der beiden Arrays nicht die gleiche, Antwort für einen besseren Ansatz für die Iteration oxbow_lakes See sein kann, wenn das Paar Schlüssel/Werte benötigt werden.

+6

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. Also das ist extrem * gefährlich * – CrackerJack9

+1

@ CrackerJack9 kannst du das erklären? –

+11

Die Schlüssel entsprechen nicht ihren Werten über die beiden Arrays. –

61

Wenn Sie die Schlüssel und Werte möchten, können Sie immer das tun über die entrySet:

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

Von jedem Eintrag können Sie (natürlich) erhalten sowohl der Schlüssel und Wert über die getKey und getValue Methoden

+2

funktioniert 2017 nicht .. .. – OhadR

+0

@OhadR Es funktioniert wirklich – Midnightas

+0

? Ich arbeite auf Java 8? – OhadR

5
Map<String, String> map = new HashMap<String, String>(); 
map.put("key1", "value1"); 
map.put("key2", "value2"); 

Object[][] twoDarray = new String[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]; 
} 

for (int i = 0; i < twoDarray.length; i++) { 
    for (int j = 0; j < twoDarray[i].length; j++) { 
     System.out.println(twoDarray[i][j]); 
    } 
} 
42

Wenn Sie HashMap<String, SomeObject> hashMap dann

wird ein Objekt [] zurückgeben. Wenn Sie stattdessen ein Array des Typs Someobject wollen, könnten Sie verwenden:

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

+3

Ich denke, du meinst 'values ​​()' anstelle von 'keySet()' für ein Array von 'SomeObject'. –

+3

Sie können die Leistung auch verbessern, indem Sie die Array-Größe im Voraus festlegen, anstatt 0 zu verwenden. Siehe Beispiel hier: http://stackoverflow.com/a/5061692/265877 – Alex

26

Um die richtige Reihenfolge für jedes Array von Schlüsseln und Werten zu gewährleisten, verwenden diese (die anderen Antworten verwenden, um einzelne Set s, die nicht bieten Garantie in Bezug auf Bestellung.

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

perfekt! Wir bekommen Schlüssel und Wert, mit Auto-Typen füllen Sie Eclipse, lange Zeit auf der Suche nach thx, thx! –

11

eine Alternative zu Crackerjacks Vorschlag, wenn Sie die HashMap wollen zu halten, um Sie in Erwägung ziehen könnten stattdessen eine LinkedHashMap verwenden. Soweit im bewusst es ist Funktionalität zu einem HashMap identisch, aber es ist FIFO Es behält die Reihenfolge bei, in der Elemente hinzugefügt wurden.

+1

Sehr guter Punkt, danke für diesen Einblick, hat mir geholfen! :) – mgibson

+0

danke für FIFO Tipp –

+0

+1 für LinkedHashMap – CrackerJack9

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 über 'HashMap()', aber Ihre Lösung ist über 'Hashtable()' ... Es gibt einige [Unterschiede] (http://stackoverflow.com/a/40878/3595288) zwischen ihnen – Choletski

3

In One Dimension Array zu bekommen.

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


in zwei Dimension Array Get.

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

habe ich fast die gleiche wie @kmccoy, sondern eine von keySet() habe ich diesen

hashMap.values().toArray(new MyObject[0]); 
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; 
    } 
Verwandte Themen