HashMap in Java drucken


129

Ich habe eine HashMap:

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

Jetzt möchte ich alle Werte durchgehen und ausdrucken.

Ich habe das geschrieben:

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

Es scheint nicht zu funktionieren.

Was ist das Problem?

EDIT: Eine andere Frage: Basiert diese Sammlung auf Null? Ich meine, wenn es 1 Schlüssel und Wert hat, wird die Größe 0 oder 1 sein?


2
Ich empfehle Ihnen, sich mit der Java-Dokumentation vertraut zu machen (sie beantwortet viele Ihrer Fragen). Dies ist beispielsweise die Dokumentation für Mapdie size()Methode : "Gibt die Anzahl der Schlüsselwertzuordnungen in dieser Zuordnung zurück. Wenn die Zuordnung mehr als Integer.MAX_VALUEElemente enthält , wird zurückgegeben Integer.MAX_VALUE."
Adam Paynter

Ihr Code sucht nach Werten in Schlüsseln - was nicht korrekt ist. Suchen Sie entweder nach Schlüsseln in Schlüsseln oder nach Werten in Werten
d-live

2
Wenn es 1 Schlüssel / Wert hat, hat es natürlich Größe 1. Dies hat jedoch nichts mit der nullbasierten Indizierung zu tun.
Jesper

Das ist eine gute Frage. Hier finden Sie jedoch eine Antwort, die dies in einer Zeile tun kann, wenn Sie die Lösung von Mingfei sehen.
HoldOffHunger

Antworten:


140

keySet () gibt nur einen Satz von Schlüsseln aus Ihrer Hashmap zurück. Sie sollten diesen Schlüsselsatz iterieren und den Wert aus der Hashmap mit diesen Schlüsseln abrufen.

In Ihrem Beispiel ist der Typ des Hashmap-Schlüssels TypeKey, aber Sie haben ihn TypeValuein Ihrer generischen for-Schleife angegeben, sodass er nicht kompiliert werden kann. Sie sollten es ändern in:

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

Update für Java8:

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

Wenn Sie keinen Schlüsselwert drucken müssen und nur den Hashmap-Wert benötigen, können Sie die Vorschläge anderer verwenden.

Eine andere Frage: Ist diese Sammlung eine Nullbasis? Ich meine, wenn es 1 Schlüssel und Wert hat, wird es 0 oder 1 sein?

Die Sammlung, von der zurückgegeben wird, keySet()ist eine Menge. Sie können den Wert einer Menge nicht mithilfe eines Index abrufen, sodass es nicht darum geht, ob er auf Null oder auf Eins basiert. Wenn Ihre Hashmap einen Schlüssel hat, enthält das zurückgegebene keySet () einen Eintrag und seine Größe ist 1.


19
Oder noch besser:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
Oder noch kompakter: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

Eine einfache Möglichkeit, die Schlüsselwertpaare anzuzeigen:

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

Sowohl Methode 1 als auch Methode 2 geben Folgendes aus:

[{b=2, a=1}]

21
Tun Sie einfach System.out.println(map);{b=2, a=1}
Folgendes

Ja ... noch eine ähnliche Ausgabe:System.out.println(map.toString());
Yo Apps

1
@yoapps hüte dich in diesem Fall vor NPE. Deshalb vermeide ich das .toStringwenn möglich.
Maroun

Das ist richtig. Die NPE lauert immer in solchen Abkürzungen. Ich wollte nur eine ähnliche Ausgabe zeigen. Ich denke besonders, wenn Sie in einem Protokoll / einer Konsole debuggen und nur einen Blick in eine Karte werfen möchten, deren Daten, von denen Sie wissen, nicht null sind. Das ist ein schnelles Feuer! Aber wenn der Code von Grund auf überprüft wird ... dann haben Sie Recht, es ist schwierig und in einem guten Programmierkontext sollte es vermieden werden!
Yo Apps

40

Angenommen, Sie haben eine Map<KeyType, ValueType>, können Sie sie wie folgt drucken:

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

16

Verwenden Sie Folgendes, um Schlüssel und Wert zu drucken:

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

1
Sie vermissen eine weitere Klammer vor dem Semikolon in der 3. Zeile.
Nktsamba


9

Sie möchten den Wertesatz, nicht den Schlüsselsatz:

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

Der Code, den Sie geben, würde nicht einmal kompiliert, was in zukünftigen Fragen erwähnenswert sein könnte - "scheint nicht zu funktionieren" ist etwas vage!


8

Erwähnenswert ist der Java 8-Ansatz mit BiConsumerund Lambda-Funktionen:

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

example.forEach(consumer);

Angenommen, Sie haben die toStringMethode der beiden Typen bei Bedarf überschrieben .


7

Für mich hat diese einfache Zeile gut funktioniert:

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

6

Eine einfache Druckanweisung mit dem Variablennamen, der die Referenz der Hash-Map enthält, würde Folgendes bewirken:

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

Dies funktioniert, weil die toString()Methode bereits überschrieben ist, AbstractMap classwas durch die HashMap Class Weitere Informationen aus der Dokumentation erweitert wird

Gibt eine Zeichenfolgendarstellung dieser Karte zurück. Die Zeichenfolgendarstellung besteht aus einer Liste von Schlüsselwertzuordnungen in der Reihenfolge, die vom Iterator der Eintrittssatzansicht der Karte in geschweiften Klammern ("{}") zurückgegeben wird. Benachbarte Zuordnungen werden durch die Zeichen "," (Komma und Leerzeichen) getrennt. Jede Schlüsselwertzuordnung wird als Schlüssel gerendert, gefolgt von einem Gleichheitszeichen ("=") gefolgt vom zugehörigen Wert. Schlüssel und Werte werden wie von String.valueOf (Object) in Strings konvertiert.


2
Dies scheint die beste Antwort von den oben genannten zu sein.
Karan Ahuja

5

Java 8 neuer Feature- forEachStil

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

Ich habe es mit String Map gemacht (wenn Sie mit String Map arbeiten).

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

Verwenden von Java 8-Funktionen


3
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten.
Dave

2

Nützlich, um Einträge in einer HashMap schnell zu drucken

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

1

Wenn die Karte eine Sammlung als Wert enthält, erfordern die anderen Antworten zusätzlichen Aufwand, um sie als Zeichenfolgen zu konvertieren, z. B. Arrays.deepToString(value.toArray())(wenn es sich um eine Karte mit Listenwerten handelt) usw.

Ich war ziemlich oft mit diesen Problemen konfrontiert und stieß auf die generische Funktion zum Drucken aller Objekte mit ObjectMappers. Dies ist an allen Orten sehr praktisch, insbesondere beim Experimentieren, und ich würde Ihnen empfehlen, diesen Weg zu wählen.

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

Sie können EntryKlasse verwenden, um HashMapleicht zu lesen .

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.