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?

burntsugar
sumber
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.

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

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

Dean Wild
sumber
7

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

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

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