การพิมพ์ HashMap ใน Java


129

ฉันมีHashMap:

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

ตอนนี้ฉันต้องการเรียกใช้ค่าทั้งหมดและพิมพ์ออกมา

ฉันเขียนสิ่งนี้:

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

ดูเหมือนจะไม่ได้ผล

อะไรคือปัญหา?

แก้ไข: คำถามอื่น: คอลเลกชันนี้ใช้ศูนย์หรือไม่? ฉันหมายความว่าถ้ามี 1 คีย์และค่าขนาดจะเป็น 0 หรือ 1?


2
ฉันขอแนะนำให้คุณทำความคุ้นเคยกับเอกสารของ Java (จะตอบคำถามของคุณได้หลายข้อ) ตัวอย่างเช่นนี้เป็นเอกสารสำหรับMap's size()วิธีการ : ' ส่งกลับจำนวนของแมปคีย์ค่าในแผนที่นี้ถ้าแผนที่มีมากกว่าInteger.MAX_VALUEองค์ประกอบผลตอบแทนInteger.MAX_VALUE.'
Adam Paynter

รหัสของคุณกำลังมองหาค่าในคีย์ซึ่งไม่ถูกต้อง มองหาคีย์ในคีย์หรือค่าในค่า
d-live

2
หากมี 1 คีย์ / ค่าแน่นอนว่าจะมีขนาด 1 แต่สิ่งนี้ไม่เกี่ยวข้องกับการจัดทำดัชนีที่อิงศูนย์
Jesper

นี่เป็นคำถามที่ดี แต่มีคำตอบที่ให้ไว้ที่นี่ซึ่งสามารถทำได้ในบรรทัดเดียวหากคุณเห็นวิธีแก้ปัญหาของ Mingfei
HoldOffHunger

คำตอบ:


140

keySet ()ส่งคืนชุดคีย์จากแฮชแมปของคุณเท่านั้นคุณควรทำซ้ำชุดคีย์นี้และรับค่าจากแฮชแมปโดยใช้คีย์เหล่านี้

ในตัวอย่างของคุณประเภทของคีย์ของแฮชแมปคือTypeKeyแต่คุณระบุไว้TypeValueใน for-loop ทั่วไปดังนั้นจึงไม่สามารถคอมไพล์ได้ คุณควรเปลี่ยนเป็น:

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

อัพเดตสำหรับ Java8:

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

หากคุณไม่ต้องการพิมพ์ค่าคีย์และต้องการค่าแฮชแมปคุณสามารถใช้คำแนะนำของผู้อื่นได้

คำถามอื่น: คอลเลกชันนี้เป็นศูนย์หรือไม่? ฉันหมายความว่าถ้ามี 1 คีย์และค่าขนาดจะเป็น 0 หรือ 1?

คอลเลกชันที่ส่งคืนจากkeySet()เป็นชุดคุณไม่สามารถรับค่าจากชุดโดยใช้ดัชนีได้ดังนั้นจึงไม่เป็นคำถามว่าเป็นแบบศูนย์หรือฐานเดียว หากแฮชแมปของคุณมีคีย์เดียวชุดคีย์ () ที่ส่งคืนจะมีหนึ่งรายการอยู่ข้างในและขนาดของมันจะเป็น 1


19
หรือยังดีกว่า:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
หรือกะทัดรัดยิ่งขึ้น: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

94

วิธีง่ายๆในการดูคู่ค่าคีย์:

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

ทั้งวิธีที่ 1 และวิธีที่ 2 แสดงผลลัพธ์ดังนี้:

[{b=2, a=1}]

21
เพียงทำตาม: System.out.println(map);, เอาต์พุต:{b=2, a=1}
Mingfei

ใช่ ... อีกหนึ่งผลลัพธ์ที่คล้ายกัน:System.out.println(map.toString());
Yo Apps

1
@yoapps ระวัง NPE ในกรณีนี้ นั่นเป็นเหตุผลที่ฉันหลีกเลี่ยง.toStringเมื่อเป็นไปได้
Maroun

นั่นเป็นความจริง NPE มักจะแฝงตัวอยู่ในทางลัดดังกล่าวเสมอ ฉันแค่อยากจะแสดงสิ่งที่คล้ายกันเท่านั้น .. ฉันคิดว่าโดยเฉพาะอย่างยิ่งเมื่อคุณกำลังแก้ไขข้อบกพร่องในบันทึก / คอนโซลและคุณเพียงแค่มองเข้าไปในแผนที่ที่มีข้อมูลที่คุณรู้ว่าไม่เป็นโมฆะ นี่คือไฟด่วน! แต่ถ้าการตรวจสอบรหัสตั้งแต่เริ่มต้น ... แสดงว่าคุณพูดถูกมันยุ่งยากและอยู่ในบริบทการเขียนโปรแกรมที่ดีก็ควรหลีกเลี่ยง!
Yo Apps

40

สมมติว่าคุณมี a Map<KeyType, ValueType>คุณสามารถพิมพ์ได้ดังนี้:

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

16

ในการพิมพ์ทั้งคีย์และค่าให้ใช้สิ่งต่อไปนี้:

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

1
คุณไม่มีวงเล็บอื่นก่อนเซมิโคลอนในบรรทัดที่ 3
nktsamba


9

คุณต้องการชุดค่าไม่ใช่ชุดคีย์:

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

รหัสที่คุณให้จะไม่รวบรวมด้วยซ้ำซึ่งอาจมีมูลค่าการกล่าวถึงในคำถามในอนาคต - "ดูเหมือนจะใช้ไม่ได้" นั้นค่อนข้างคลุมเครือ!


8

ควรกล่าวถึงแนวทาง Java 8 การใช้BiConsumerและฟังก์ชันแลมบ์ดา:

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

example.forEach(consumer);

สมมติว่าคุณได้ลบล้างtoStringเมธอดของทั้งสองประเภทหากจำเป็น


7

สำหรับฉันบรรทัดเดียวที่เรียบง่ายนี้ใช้ได้ดี:

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

6

คำสั่งพิมพ์ธรรมดาที่มีชื่อตัวแปรซึ่งมีการอ้างอิงของ Hash Map จะทำ:

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

วิธีนี้ใช้ได้ผลเนื่องจากtoString()เมธอดนี้ถูกยกเลิกไปแล้วAbstractMap classซึ่งขยายโดยHashMap Class ข้อมูลเพิ่มเติมจากเอกสารประกอบ

ส่งกลับการแสดงสตริงของแผนที่นี้ การแทนค่าสตริงประกอบด้วยรายการของการแมปคีย์ - ค่าตามลำดับที่ส่งคืนโดยตัววนซ้ำของมุมมอง entrySet ของแผนที่ซึ่งอยู่ในวงเล็บปีกกา ("{}") การแมปที่อยู่ติดกันจะคั่นด้วยอักขระ "," (ลูกน้ำและช่องว่าง) การแมปคีย์ - ค่าแต่ละรายการจะแสดงผลเป็นคีย์ตามด้วยเครื่องหมายเท่ากับ ("=") ตามด้วยค่าที่เกี่ยวข้อง คีย์และค่าจะถูกแปลงเป็นสตริงโดย String.valueOf (Object)


2
สิ่งนี้ดูเหมือนจะเป็นคำตอบที่ดีที่สุดจากคำตอบด้านบน
Karan Ahuja

5

forEachรูปแบบคุณลักษณะใหม่ของ Java 8

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

ฉันทำโดยใช้ String map (ถ้าคุณกำลังทำงานกับ 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));

ใช้คุณสมบัติ java 8


3
แม้ว่ารหัสนี้จะช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Dave


1

หากแผนที่มีคอลเล็กชันเป็นค่าคำตอบอื่น ๆ ต้องใช้ความพยายามเพิ่มเติมในการแปลงเป็นสตริงเช่น Arrays.deepToString(value.toArray()) (หากเป็นแผนที่ของค่ารายการ) เป็นต้น

ฉันประสบปัญหาเหล่านี้ค่อนข้างบ่อยและเจอฟังก์ชันทั่วไปในการพิมพ์วัตถุทั้งหมดโดยใช้ObjectMappersไฟล์. สิ่งนี้มีประโยชน์ในทุกสถานที่โดยเฉพาะอย่างยิ่งในระหว่างการทดลองสิ่งต่างๆและฉันขอแนะนำให้คุณเลือกวิธีนี้

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

คุณสามารถใช้Entryคลาสเพื่ออ่านHashMapได้อย่างง่ายดาย

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.