it-swarm.com.de

HashMap in Java drucken

Ich habe eine HashMap:

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

Nun möchte ich alle Werte durchlaufen und ausdrucken.

Ich habe das geschrieben:

for (TypeValue name: this.example.keySet()){

        System.out.println(name);
} 

Es scheint nicht zu funktionieren.

Worin besteht das Problem?

EDIT: Eine andere Frage: Wird diese Sammlung auf null gesetzt? Ich meine, wenn es 1 Schlüssel hat und Wert ist die Größe 0 oder 1?

81
Unknown user

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

In Ihrem Beispiel ist der Schlüssel des Hashmaps TypeKey, Sie haben jedoch TypeValue in Ihrer generischen for-Schleife angegeben, sodass sie 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);  


} 

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

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

Die von keySet() zurückgegebene Auflistung ist ein Set . Sie können den Wert von einem Set nicht über einen Index abrufen. Es ist also keine Frage, ob es sich um einen null- oder einen einseitigen handelt. Wenn Ihre Hashmap einen Schlüssel hat, enthält das zurückgegebene keySet () einen Eintrag, dessen Größe 1 ist.

87
Ken Chan

Eine einfache Möglichkeit, die Schlüsselwertpaare zu sehen:

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}]
65
Mingfei

Vorausgesetzt, Sie haben einen Map<KeyType, ValueType>, können Sie ihn folgendermaßen drucken:

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

Verwenden Sie zum Drucken von Schlüssel und Wert Folgendes:

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

Sie haben mehrere Möglichkeiten

13
Bozho

Sie möchten den Wert festlegen, nicht den Schlüssel:

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

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

9
davmac

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

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

example.forEach(consumer);

Angenommen, Sie haben die toString-Methode der beiden Typen bei Bedarf überschrieben.

7
Maroun

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());
}
4
Edson Júnior

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

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

Dies funktioniert, weil die toString()-Methode in AbstractMap class, das um den HashMap Class.__ erweitert wird, bereits überschrieben ist. Weitere Informationen aus der Dokumentation 

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

3
arjun gulyani

Java 8 neues Feature forEach style 

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

    }
}
2
ahmet

Für mich hat diese einfache Zeile gut funktioniert:

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

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

Ich bin diesen Problemen ziemlich oft begegnet und bin auf die generische Funktion gestoßen, um alle Objekte mit ObjectMappers zu drucken. Dies ist an allen Orten praktisch, vor allem 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;
}
1
Thirukka Karnan
map.forEach((key, value) -> System.out.println(key + " " + value));

Verwenden von Java 8-Funktionen

0
Thorgal

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

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

Sie können die Entry-Klasse verwenden, um HashMap leicht zu lesen.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
0
Sagar Ch