Ich suche nach einer schönen Möglichkeit, a hübsch zu drucken Map
.
map.toString()
gibt mir: {key1=value1, key2=value2, key3=value3}
Ich möchte mehr Freiheit bei meinen Karteneintragswerten und suche etwas Ähnliches: key1="value1", key2="value2", key3="value3"
Ich habe diesen kleinen Code geschrieben:
StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
sb.append(entry.getKey());
sb.append('=').append('"');
sb.append(entry.getValue());
sb.append('"');
if (iter.hasNext()) {
sb.append(',').append(' ');
}
}
return sb.toString();
Ich bin mir jedoch sicher, dass es dafür einen eleganteren und prägnanteren Weg gibt.
java
dictionary
pretty-print
space_monkey
quelle
quelle
System.out.println
zu nahe beieinander liegen. Und wenn Sie etwas Benutzerdefiniertes wollen, läuft dies darauf hinaus, "wie man eine Karte in Java durchläuft", was sicherlich viele andere Antworten hat.Antworten:
Oder bringen Sie Ihre Logik in eine ordentliche kleine Klasse.
Verwendung:
Hinweis: Sie können diese Logik auch in eine Dienstprogrammmethode einfügen.
quelle
quelle
Map<String, Map<String,double[]>>
, dann bekommen Sie diese Art von Stich:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Schauen Sie sich die Guavenbibliothek an:
quelle
Apache-Bibliotheken zur Rettung!
Alles was Sie brauchen Apache Commons-Sammlungen Bibliothek ( Projektlink )
Maven-Benutzer können die Bibliothek mithilfe dieser Abhängigkeit hinzufügen:
quelle
Map<String, String[]>
). Anstelle der tatsächlichen Werte werden nur der Klassenname und der Hash gedruckt.Simpel und einfach. Willkommen in der JSON-Welt. Verwenden von Google Gson :
Beispiel einer Karte mit 3 Tasten:
quelle
Wenn ich
org.json.JSONObject
im Klassenpfad bin, mache ich:(Dadurch werden Listen, Sets und Karten, die verschachtelt sein können, wunderschön eingerückt.)
quelle
Verwenden von Java 8-Streams:
quelle
,
Ich ziehe es vor, die Map in eine JSON-Zeichenfolge zu konvertieren.
unterstützt verschachtelte komplexe Typen innerhalb des Objekts
quelle
Schauen Sie sich den Code für
HashMap#toString()
undAbstractMap#toString()
in den OpenJDK-Quellen an:Wenn die Jungs von OpenJDK keinen eleganteren Weg gefunden haben, gibt es keinen :-)
quelle
Sie sollten in der Lage sein, das zu tun, was Sie wollen, indem Sie Folgendes tun:
System.out.println(map)
beispielsweiseSolange ALLE Ihre Objekte in der Karte die
toString
Methode überschrieben haben, die Sie sehen würden:{key1=value1, key2=value2}
auf sinnvolle WeiseWenn dies für Ihren Code gilt, ist das Überschreiben
toString
eine gute Angewohnheit, und ich schlage vor, dass Sie sich stattdessen dafür entscheiden.Für Ihr Beispiel, wo sich Ihre Objekte befinden
String
, sollten Sie ohne irgendetwas anderes in Ordnung sein.Dh
System.out.println(map)
ohne zusätzlichen Code genau das drucken, was Sie brauchenquelle
java.util.Map
hat keinen Vertrag bezüglichtoString()
, es liegt also an der tatsächlichenMap
Implementierung, wasSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
verursachen wird. Es kommt vor, dass die häufig verwendetejava.util.AbstractMap
eine schöne Zeichenfolgendarstellung für bietettoString()
. ... AndereMap
Implementierungen können zurückgreifenObject.toString()
, was zu weniger informativen Ergebnissen führtcom.example.MyMap@4e8c0de
.quelle
Ich denke, so etwas wäre sauberer und bietet Ihnen mehr Flexibilität beim Ausgabeformat (einfach Vorlage ändern):
Ich weiß, dass es hässlich ist, das letzte Komma entfernen zu müssen, aber ich denke, es ist sauberer als Alternativen wie die in dieser Lösung oder manuell mit einem Iterator.
quelle
Als schnelle und schmutzige Lösung, die die vorhandene Infrastruktur nutzt, können Sie Ihre
uglyPrintedMap
in eine einpackenjava.util.HashMap
und dann verwendentoString()
.quelle
Beantwortet nicht genau die Frage, aber es ist erwähnenswert, Lombodok
@ToString
Annotation . Wenn Sie mit@ToString
denkey / value
Klassen Anmerkungen machen , gibt diesSystem.out.println(map)
etwas Sinnvolles zurück.Es funktioniert auch sehr gut mit Karten von Karten, zum Beispiel:
Map<MyKeyClass, Map<String, MyValueClass>>
wird gedruckt als{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
quelle
String result = objectMapper.writeValueAsString(map)
- so einfach!Ergebnis:
PS Fügen Sie Jackson JSON zu Ihrem Klassenpfad hinzu.
quelle
Seit Java 8 gibt es eine einfache Möglichkeit, dies mit Lambda zu tun:
quelle