Pertanyaan Iterate melalui HashMap [duplikat]


Kemungkinan Duplikat: 
Cara efisien mengiterasi setiap entri dalam 'Peta'?

Apa cara terbaik untuk mengulangi item di a HashMap?


2827
2018-06-30 23:24


asal


Jawaban:


Iterasi melalui entrySet() seperti ini:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

Baca lebih lanjut tentang Map.


2835
2018-06-30 23:27



Jika Anda hanya tertarik pada kunci, Anda dapat melakukan iterasi melalui keySet() dari peta:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Jika Anda hanya membutuhkan nilai, gunakan values():

for (Object value : map.values()) {
    // ...
}

Akhirnya, jika Anda menginginkan kunci dan nilai, gunakan entrySet():

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

Satu peringatan: jika Anda ingin menghapus item mid-iteration, Anda harus melakukannya melalui Iterator (lihat Jawaban Karim79). Namun, mengubah nilai barang adalah OK (lihat Map.Entry).


4119
2018-06-30 23:28



Diekstraksi dari referensi Bagaimana Iterate Over a Map di Java:

Ada beberapa cara iterasi lebih dari satu Map di Jawa. Mari kita membahas metode yang paling umum dan meninjau kelebihan dan kekurangan mereka. Karena semua peta di Jawa mengimplementasikan antarmuka Peta, teknik berikut akan berfungsi untuk implementasi peta apa pun (HashMap, TreeMap, LinkedHashMap, Hashtable, dll.)

Metode # 1: Iterasi entri menggunakan loop For-Each.

Ini adalah metode yang paling umum dan lebih disukai dalam banyak kasus. Ini harus digunakan jika Anda membutuhkan kedua kunci dan nilai peta dalam loop.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Perhatikan bahwa loop For-Each diperkenalkan di Java 5, jadi metode ini hanya bekerja pada versi bahasa yang lebih baru. Juga untuk setiap loop akan melempar NullPointerException jika Anda mencoba mengulangi peta yang tidak valid, jadi sebelum mengulangi, Anda harus selalu memeriksa referensi null.

Metode # 2: Iterasi di atas kunci atau nilai menggunakan loop For-Each.

Jika Anda hanya memerlukan kunci atau nilai dari peta, Anda dapat mengulangi lebih dari keySet atau nilai daripada entrySet.

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

// Iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}

// Iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

Metode ini memberikan sedikit kelebihan kinerja entrySet iterasi (sekitar 10% lebih cepat) dan lebih bersih.

Metode # 3: Iterasi menggunakan Iterator.

Menggunakan Generik:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

Tanpa Generik:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}

Anda juga dapat menggunakan teknik yang sama untuk melakukan iterasi keySet atau nilai-nilai.

Metode ini mungkin terlihat berlebihan, tetapi memiliki kelebihan tersendiri. Pertama-tama, ini adalah satu-satunya cara untuk mengulang peta di versi Java yang lebih lama. Fitur penting lainnya adalah bahwa ini adalah satu-satunya metode yang memungkinkan Anda untuk menghapus entri dari peta selama iterasi dengan menelepon iterator.remove(). Jika Anda mencoba melakukan ini selama setiap kali iterasi, Anda akan mendapatkan "hasil yang tidak dapat diprediksi" menurut Javadoc.

Dari sudut pandang kinerja metode ini sama dengan iterasi Untuk Setiap.

Metode # 4: Iterasi kunci dan mencari nilai (tidak efisien).

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key = " + key + ", Value = " + value);
}

Ini mungkin terlihat seperti alternatif yang lebih bersih untuk metode # 1, tetapi dalam praktiknya cukup lambat dan tidak efisien karena mendapatkan nilai dengan kunci mungkin memakan waktu (metode ini dalam implementasi Peta yang berbeda adalah 20% -200% lebih lambat daripada metode # 1 ). Jika Anda menginstal FindBugs, ini akan mendeteksi ini dan memperingatkan Anda tentang iterasi yang tidak efisien. Metode ini harus dihindari.

Kesimpulan:

Jika Anda hanya memerlukan kunci atau nilai dari peta, gunakan metode # 2. Jika Anda terjebak dengan Java versi lama (kurang dari 5) atau berencana menghapus entri selama iterasi, Anda harus menggunakan metode # 3. Kalau tidak gunakan metode # 1.


739
2017-12-08 14:19



Anda dapat melakukan iterasi melalui entri dalam a Map dalam beberapa cara. Dapatkan setiap kunci dan nilai seperti ini:

Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
    System.out.println("Key " + e.getKey());
    System.out.println("Value " + e.getValue());
}

Atau Anda bisa mendapatkan daftar kunci

Collection<?> keys = map.keySet();
for(Object key: keys){
    System.out.println("Key " + key);
    System.out.println("Value " + map.get(key));
}

Jika Anda hanya ingin mendapatkan semua nilai dan tidak peduli dengan kunci, Anda dapat menggunakan:

Collection<?> values = map.values();

77
2018-06-30 23:43



for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}

70
2017-07-23 01:28



Lebih Cerdas:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

55
2017-08-11 10:01



Tergantung. Jika Anda tahu Anda akan membutuhkan kunci dan nilai setiap entri, kemudian pergi melalui entrySet. Jika Anda hanya butuh nilai, maka ada values() metode. Dan jika Anda hanya butuh kunci, maka gunakan keyset().

Praktik yang buruk adalah melakukan iterasi melalui semua kunci, dan kemudian di dalam loop, selalu dilakukan map.get(key) untuk mendapatkan nilainya. Jika Anda melakukan itu, maka opsi pertama yang saya tulis adalah untuk Anda.


40
2018-06-30 23:29