Java: cara mengonversi HashMap <String, Object> menjadi array


116

Saya perlu mengubah a HashMap<String, Object>menjadi array; Adakah yang bisa menunjukkan kepada saya bagaimana ini dilakukan?


4
Anda menginginkan kunci, nilai, atau keduanya?
harto

Jawaban:


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

Sunting

Perlu dicatat bahwa urutan kedua larik mungkin tidak sama, Lihat jawaban oxbow_lakes untuk pendekatan iterasi yang lebih baik ketika pasangan kunci / nilai diperlukan.


9
Sebenarnya, kode ini tidak memberikan jaminan bahwa hashMap.keySet (). ToArray () [0] akan menjadi kunci asli untuk hashMap.values ​​(). ToArray () [0] dari Peta asli. Jadi ini sangat berbahaya
CrackerJack9

2
@ CrackerJack9 dapatkah Anda menjelaskan?
Jake Wilson

12
Kunci tidak akan sesuai dengan nilainya di dua larik.
Landon Kuhn

5
@Jakobud landon9720 benar ... urutannya psuedo-random, dan tidak dapat dijamin bahwa kunci [0] akan sesuai dengan nilai [0] setelah Anda mengonversi kunci menjadi a Setdan nilainya menjadi a Collection. Sementara mereka secara teknis diubah menjadi array (dan menjawab pertanyaan Anda), konsep key-value pair telah hilang - itulah mengapa ini adalah jawaban yang sangat menyesatkan (dan berbahaya) ....
CrackerJack9

Saya dapat membuktikan bahaya potongan kode ini. Ketika saya menulisnya, terminal saya mengulurkan tangan dan menampar saya. Sangat berbahaya! Awas!
artburkart

65

Jika Anda menginginkan kunci dan nilai, Anda selalu dapat melakukan ini melalui entrySet:

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

Dari setiap entri, Anda (tentu saja) bisa mendapatkan kunci dan nilai melalui metode getKeydangetValue


@ CrackerJack9 Tidak, itu berhasil. Tidak seperti solusi yang diterima, yang satu ini mempertahankan pasangan nilai kunci. Anda mendapatkan {key, value}[]kebalikan darikey[], value[]
Tobiq

51

Jika Anda memiliki HashMap<String, SomeObject> hashMap:

hashMap.values().toArray();

Akan mengembalikan Object[]. Jika sebaliknya Anda menginginkan sebuah array dari tipe tersebut SomeObject, Anda dapat menggunakan:

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

3
Saya pikir yang Anda maksud values()bukan keySet()untuk sebuah array SomeObject.
Paul Bellora

4
Anda juga dapat meningkatkan kinerja dengan menentukan ukuran larik di muka daripada menggunakan 0. Lihat contoh di sini: stackoverflow.com/a/5061692/265877
Alex

@Alex "Dalam versi Java yang lebih lama menggunakan larik berukuran sebelumnya disarankan (...) Namun sejak pembaruan terakhir OpenJDK 6, panggilan ini telah di-intrinsifikasi, membuat kinerja versi larik kosong menjadi sama dan terkadang bahkan lebih baik, dibandingkan dengan versi sebelumnya. versi berukuran. Juga meneruskan larik ukuran sebelumnya berbahaya untuk koleksi serentak atau tersinkronisasi karena balapan data dimungkinkan antara pemanggilan ukuran dan toArray yang dapat menghasilkan null tambahan di akhir larik, jika koleksi secara bersamaan menyusut selama operasi." - intellij
Hamburg bagus

30

Untuk menjamin urutan yang benar untuk setiap larik Kunci dan Nilai, gunakan ini (jawaban lain menggunakan jawaban individu Setyang tidak menawarkan jaminan untuk memesan.

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

sempurna! kami mendapatkan kunci dan nilai, dengan tipe otomatis mengisi gerhana, lama mencari ini, terima kasih!
Aquarius Power

12

Alternatif untuk saran CrackerJacks, jika Anda ingin HashMap mempertahankan ketertiban, Anda dapat mempertimbangkan untuk menggunakan LinkedHashMap sebagai gantinya. Sejauh yang saya tahu, fungsinya identik dengan HashMap tetapi FIFO sehingga menjaga urutan item ditambahkan.


7

Saya menggunakan hampir sama dengan @kmccoy, tetapi alih-alih a keySet()saya melakukan ini

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

Untuk Masuk dalam Array Satu Dimensi.

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


Untuk Masuk dalam dua Dimensi Array.

   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

Jika Anda menggunakan Java 8+ dan membutuhkan 2 dimensi Array, mungkin untuk penyedia data TestNG, Anda dapat mencoba:

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

Jika Objects Anda s Stringdan Anda membutuhkan String[][], coba:

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

0

Anda bisa mencobanya juga.

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

Di sini saya menggunakan String sebagai tipe pengembalian. Anda dapat mengubahnya menjadi jenis pengembalian yang diminta oleh Anda.


1
pertanyaannya adalah tentang HashMap()tetapi solusi Anda adalah tentang Hashtable()... Ada beberapa perbedaan di antara mereka
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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.