Mencetak HashMap Di Jawa


129

Saya punya HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

Sekarang saya ingin menjalankan semua nilai dan mencetaknya.

Saya menulis ini:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

Sepertinya tidak berhasil.

Apa masalahnya?

EDIT: Pertanyaan lain: Apakah koleksi ini berbasis nol? Maksud saya jika memiliki 1 kunci dan nilainya akankah ukurannya 0 atau 1?


2
Saya sarankan Anda menjadi terbiasa dengan dokumentasi Java (itu akan menjawab banyak pertanyaan Anda). Sebagai contoh, ini merupakan dokumentasi untuk Map's size()metode : ' Pengembalian jumlah pemetaan kunci-nilai dalam peta ini Jika peta berisi lebih dari Integer.MAX_VALUEelemen, kembali Integer.MAX_VALUE.'
Adam Paynter

Kode Anda mencari Nilai di Kunci - yang tidak benar. Baik mencari kunci di Kunci atau nilai dalam Nilai
d-live

2
Jika memiliki 1 kunci / nilai, tentu saja akan memiliki ukuran 1. Tetapi ini tidak ada hubungannya dengan pengindeksan berbasis nol.
Jesper

Ini pertanyaan yang bagus. Tetapi ada jawaban di sini yang disediakan di sini yang dapat melakukan ini dalam satu baris, jika Anda melihat solusi Mingfei.
HoldOffHunger

Jawaban:


140

keySet () hanya mengembalikan satu set kunci dari hashmap Anda, Anda harus iterate set kunci ini dan dapatkan nilai dari hashmap menggunakan kunci-kunci ini.

Dalam contoh Anda, tipe kunci hashmap adalah TypeKey, tetapi Anda tentukan TypeValuedalam for-loop generik Anda, sehingga tidak dapat dikompilasi. Anda harus mengubahnya ke:

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Pembaruan untuk Java8:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

Jika Anda tidak perlu mencetak nilai kunci dan hanya membutuhkan nilai hashmap, Anda dapat menggunakan saran orang lain.

Pertanyaan lain: Apakah koleksi ini nol basis? Maksud saya jika memiliki 1 kunci dan nilainya apakah ukurannya 0 atau 1?

Koleksi yang dikembalikan dari keySet()adalah Set . Anda tidak bisa mendapatkan nilai dari Set menggunakan indeks, jadi itu bukan pertanyaan apakah itu berbasis nol atau berbasis satu. Jika hashmap Anda memiliki satu kunci, keySet () yang dikembalikan akan memiliki satu entri di dalamnya, dan ukurannya adalah 1.


19
Atau lebih baik lagi:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
Atau bahkan lebih ringkas: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

Cara sederhana untuk melihat pasangan nilai kunci:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

Metode 1 dan metode 2 menghasilkan ini:

[{b=2, a=1}]

21
Lakukan saja sebagai System.out.println(map);{b=2, a=1}
:,

Ya ... satu lagi keluaran serupa:System.out.println(map.toString());
Aplikasi Yo

1
@yoapps waspadalah terhadap NPE dalam hal ini. Itu sebabnya saya menghindari .toStringketika mungkin.
Maroun

Itu benar. NPE selalu bersembunyi di jalan pintas seperti itu. Saya hanya ingin menunjukkan tampilan yang sama .. Saya pikir terutama ketika Anda sedang debug ke log / konsol dan Anda hanya ingin mengintip ke peta yang datanya Anda tahu bukan nol. ini api cepat! Tetapi jika kodenya memeriksa dari awal ... maka Anda benar, rumit dan dalam konteks pemrograman yang baik, itu harus dihindari!
Aplikasi Yo

40

Dengan asumsi Anda memiliki Map<KeyType, ValueType>, Anda dapat mencetaknya seperti ini:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

Untuk mencetak kunci dan nilai, gunakan yang berikut ini:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
Anda kehilangan braket lain sebelum titik koma di baris ke-3.
nktsamba


9

Anda ingin set nilai, bukan set kunci:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

Kode yang Anda berikan bahkan tidak dapat dikompilasi, yang mungkin layak disebutkan dalam pertanyaan di masa depan - "sepertinya tidak berfungsi" agak kabur!


8

Layak disebutkan pendekatan Java 8, menggunakan BiConsumerdan fungsi lambda:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

Dengan asumsi bahwa Anda telah mengganti toStringmetode kedua jenis jika diperlukan.


7

Bagi saya, satu baris sederhana ini bekerja dengan baik:

Arrays.toString(map.entrySet().toArray())

6

Pernyataan cetak sederhana dengan nama variabel yang berisi referensi Peta Hash akan dilakukan:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

Ini berfungsi karena toString()metode ini sudah terlalu banyak digunakan AbstractMap classyang diperluas dengan HashMap Class informasi selengkapnya dari dokumentasi

Mengembalikan representasi string dari peta ini. Representasi string terdiri dari daftar pemetaan nilai kunci dalam urutan yang dikembalikan oleh iterator viewSet view peta, terlampir dalam kurung kurawal ("{}"). Pemetaan yang berdekatan dipisahkan oleh karakter "," (koma dan spasi). Setiap pemetaan nilai kunci diberikan sebagai kunci diikuti oleh tanda sama dengan ("=") diikuti oleh nilai terkait. Kunci dan nilai dikonversi ke string seperti oleh String.valueOf (Object).


2
ini tampaknya menjadi jawaban terbaik dari yang di atas.
Karan Ahuja

5

Java 8 forEachgaya fitur baru

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

Saya melakukannya menggunakan String map (jika Anda bekerja dengan String Map).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Menggunakan fitur java 8


3
Sementara kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu untuk meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
Dave

2

Berguna untuk mencetak entri dengan cepat di HashMap

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

Jika peta menyimpan koleksi sebagai nilai, jawaban yang lain membutuhkan upaya tambahan untuk mengubahnya sebagai string, seperti Arrays.deepToString(value.toArray())(jika itu peta nilai daftar), dll.

Saya menghadapi masalah ini cukup sering dan menemukan fungsi generik untuk mencetak semua objek menggunakan ObjectMappers. Ini sangat berguna di semua tempat, terutama selama bereksperimen, dan saya akan merekomendasikan Anda untuk memilih cara ini.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

Anda dapat menggunakan Entrykelas untuk membaca HashMapdengan mudah.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
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.