Java: HashMap <String, Object> diziye nasıl dönüştürülür


116

HashMap<String, Object>A'yı diziye dönüştürmem gerekiyor ; kimse bana nasıl yapıldığını gösterebilir mi?


4
anahtarları mı, değerleri mi yoksa her ikisini mi istiyorsunuz?
harto

Yanıtlar:


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

Düzenle

Her iki dizinin sıralamasının aynı olmayabileceğine dikkat edilmelidir. Çift anahtar / değerlere ihtiyaç duyulduğunda yineleme için daha iyi bir yaklaşım için oxbow_lakes cevabına bakın.


9
Aslında, bu kod hashMap.keySet (). ToArray () [0] 'ın hashMap.values ​​(). ToArray () [0] için orijinal haritadan orijinal anahtar olacağına dair hiçbir garanti vermez. Yani bu son derece tehlikeli
CrackerJack9

2
@ CrackerJack9 açıklayabilir misin?
Jake Wilson

12
Anahtarlar, iki dizideki değerlerine karşılık gelmez.
Landon Kuhn

5
@Jakobud landon9720 sipariş psuedo rastgele ... doğru olduğunu ve bir anahtarlarını dönüştürdükten sonra anahtar [0] değeri [0] tekabül edeceği garanti edilemez Setbir ve değerler Collection. Teknik olarak dizilere dönüştürülürken (ve sorunuzu yanıtlarken), anahtar / değer çifti kavramı kayboldu - bu yüzden bu çok yanıltıcı (ve tehlikeli) bir yanıttır ....
CrackerJack9

Bu kod parçacığının tehlikesini kanıtlayabilirim. Yazdığımda terminalim uzanıp bana tokat attı. Son derece tehlikeli! Dikkat!
artburkart

65

Anahtarları ve değerleri istiyorsanız, bunu her zaman şu yolla yapabilirsiniz entrySet:

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

Her giriş itibaren (elbette) tuşuna hem alabilirsiniz ve üzeri değerini getKeyve getValueyöntemlere


@ CrackerJack9 Hayır, işe yarıyor. Kabul edilen çözümün aksine, bu çözüm anahtar / değer çiftlerini korur. Sen olsun {key, value}[]diye karşı çıktıkey[], value[]
Tobiq

51

Eğer HashMap<String, SomeObject> hashMapöyleyse:

hashMap.values().toArray();

Bir Object[]. Bunun yerine, türde bir dizi SomeObjectistiyorsanız, şunu kullanabilirsiniz:

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

3
Sanırım bir dizi values()yerine demek istiyorsun . keySet()SomeObject
Paul Bellora

4
0 kullanmak yerine dizi boyutunu önceden belirterek de performansı artırabilirsiniz. Buradaki örneğe bakın: stackoverflow.com/a/5061692/265877
Alex

@Alex "Önceden boyutlandırılmış dizi kullanan eski Java sürümlerinde önerildi (...) Ancak, OpenJDK 6'nın son güncellemelerinden bu yana bu çağrı, boş dizi sürümünün performansını öncekine kıyasla aynı ve bazen daha iyi hale getirdi. Ayrıca önceden boyutlandırılmış diziyi iletmek, eşzamanlı veya eşzamanlı bir koleksiyon için tehlikelidir çünkü boyut ve toArray çağrısı arasında bir veri yarışı mümkündür, bu da koleksiyon sırasında eşzamanlı olarak küçültülmüşse dizinin sonunda fazladan boş değerlere neden olabilir. operasyon." - intellij
Hamburg güzel

30

Her bir Anahtar ve Değer dizisi için doğru sırayı garanti etmek için, bunu kullanın (diğer cevaplar Set, sipariş konusunda hiçbir garanti sunmayan tek tek cevapları kullanır .

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

mükemmel! Otomatik türlerin tutulmayı doldurmasıyla hem anahtarı hem de değeri elde ederiz, bunu uzun zamandır arıyoruz, teşekkürler!
Aquarius Power

12

CrackerJacks önerisine bir alternatif, HashMap'in düzeni korumasını istiyorsanız, bunun yerine bir LinkedHashMap kullanmayı düşünebilirsiniz. Bildiğim kadarıyla işlevselliği bir HashMap ile aynıdır, ancak FIFO olduğundan, öğelerin eklendiği sırayı korur.


7

@Kmccoy ile neredeyse aynı şeyi kullandım, ancak a yerine keySet()bunu yaptım

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

Bir Boyut Dizisine Girmek İçin.

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


İki Boyut Dizisine Girmek İçin.

   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

Java 8+ kullanıyorsanız ve Arraybelki TestNG veri sağlayıcıları için 2 boyutlu bir ihtiyacınız varsa, deneyebilirsiniz:

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

Eğer s'niz Objects ise Stringve bir a ihtiyacınız varsa String[][], şunu deneyin:

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

0

Bunu da deneyebilirsiniz.

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

Burada dönüş türü olarak String kullanıyorum. Sizin tarafınızdan istenen iade türüne değiştirebilirsiniz.


1
soru hakkında HashMap()ancak çözüm hakkında Hashtable()bazı vardır ... farklılıklar aralarında
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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.