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?

Unbekannter Benutzer
quelle
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.

Ken Chan
quelle
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}]
Mingfei
quelle
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());
}
user000001
quelle
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));
 }
Venkatesh
quelle
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!

Davmac
quelle
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 .

Maroun
quelle
7

Für mich hat diese einfache Zeile gut funktioniert:

Arrays.toString(map.entrySet().toArray())
KayV
quelle
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.

Arjun Gulyani
quelle
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

    }
}
ahmet
quelle
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());
}
Edson Júnior
quelle
3
map.forEach((key, value) -> System.out.println(key + " " + value));

Verwenden von Java 8-Funktionen

Th0rgal
quelle
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()));
Schwelle
quelle
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;
}
Thirukka Karnan
quelle
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
}
Sagar Chilukuri
quelle