Ich möchte ein Stack<Integer>
Objekt so schön drucken wie der Eclipse-Debugger (dh [1,2,3...]
), aber das Drucken mit out = "output:" + stack
liefert nicht dieses schöne Ergebnis.
Zur Verdeutlichung spreche ich von Javas integrierter Sammlung, damit ich sie nicht überschreiben kann toString()
.
Wie kann ich eine schöne druckbare Version des Stapels erhalten?
java
debugging
pretty-print
Elazar Leibovich
quelle
quelle
AbstractCollection@toString
(und damitString + Stack
) wird es bereits so gedruckt, wie Sie es möchten.Antworten:
Sie können es in ein Array konvertieren und dann ausdrucken mit
Arrays.toString(Object[])
:quelle
stack.toArray()
kann sehr teuer sein, CPU, Zeit und Speicher weise. Eine Lösung, die über die ursprüngliche Sammlung / iterable iteriert, wäre wahrscheinlich weniger ressourcenintensiv.(Java 8)
quelle
yourCollection.stream().map( o -> o.toString() ).collect( joining(",") ))
ist besser, weil Sie es von links nach rechts lesen. Sie müssen nicht nach vorne schauen, um in Ihrem Gehirn zu berechnen, was mit der Zwischenliste gemacht wirdMit Java 8 Streams und Sammlern geht das ganz einfach:
Zuerst verwenden wir
map
mitObject::toString
, umCollection<String>
einen Join-Collector zu erstellen, und verwenden dann Joining Collector, um jedes Element in der Sammlung mit einem,
Trennzeichen zu verbinden.quelle
Collections.toString(stack)
wäre einfach.Die vom Apache Commons-Projekt angebotene MapUtils-Klasse bietet eine
MapUtils.debugPrint
Methode, mit der Ihre Karte hübsch gedruckt werden kann.quelle
System.out.println (Sammlung c) druckt bereits jede Art von Sammlung in lesbarem Format. Nur wenn die Sammlung benutzerdefinierte Objekte enthält, müssen Sie toString () in einer benutzerdefinierten Klasse implementieren, um Inhalte anzuzeigen.
quelle
Implementieren Sie toString () in der Klasse.
Ich empfehle den Apache Commons ToStringBuilder , um dies zu vereinfachen. Damit müssen Sie nur diese Art von Methode schreiben:
Um diese Art von Ausgabe zu erhalten:
Es gibt auch eine reflektierende Implementierung .
quelle
Guave sieht nach einer guten Option aus:
Iterables.toString(myIterable)
quelle
Ich stimme den obigen Kommentaren zum Überschreiben
toString()
Ihrer eigenen Klassen zu (und zur weitestgehenden Automatisierung dieses Prozesses).Für Klassen, die Sie nicht definiert haben, können Sie
ToStringHelper
für jede Bibliotheksklasse, die Sie nach Ihrem Geschmack behandeln möchten , eine Klasse mit einer überladenen Methode schreiben :BEARBEITEN: Als Antwort auf den Kommentar von xukxpvfzflbbld ist hier eine mögliche Implementierung für die zuvor genannten Fälle.
Dies ist keine vollständige Implementierung, sondern nur ein Anfang.
quelle
Sie können die Klasse "Objekte" von JAVA verwenden (verfügbar seit 1.7).
Ausgabe: 1273, 123, 876, 897
Eine andere Möglichkeit ist die Verwendung der Klasse "MoreObjects" von Google Guave , die viele nützliche Hilfsfunktionen bietet:
Ausgabe: NameOfYourObject = [1273, 123, 876, 897]
Guavendokumente
quelle
Objects.toString()
ruft einfachtoString()
die Sammlung auf. In Ihrem Beispiel funktioniert dies, weil vermutlichtoString()
auf der Array-gestützten Sammlung hübsch gedruckt wird.Mit Apache Commons 3 möchten Sie anrufen
quelle
In Java8
oder
quelle
Das vorherige Beispiel wurde so geändert, dass sogar eine Sammlung mit benutzerdefinierten Objekten gedruckt wird.
quelle
Die meisten Sammlungen haben
toString()
heutzutage eine nützliche Java-Version (Java7 / 8). Sie müssen also keine Stream-Vorgänge ausführen, um das zu verketten, was Sie benötigen. Überschreiben Sie einfachtoString
Ihre Wertklasse in der Sammlung, und Sie erhalten das, was Sie benötigen.Sowohl AbstractMap als auch AbstractCollection implementieren toString (), indem sie toString pro Element aufrufen.
Unten finden Sie eine Testklasse, um das Verhalten zu zeigen.
quelle
JSON
Eine alternative Lösung könnte darin bestehen, Ihre Sammlung in das JSON- Format zu konvertieren und den Json-String zu drucken. Der Vorteil ist ein gut formatierter und lesbarer Object-String, ohne dass der implementiert werden muss
toString()
.Beispiel mit Gson von Google :
quelle
Wenn dies Ihre eigene Auflistungsklasse ist und keine eingebaute, müssen Sie die toString-Methode überschreiben. Eclipse ruft diese Funktion für alle Objekte auf, für die es keine fest verdrahtete Formatierung gibt.
quelle
Seien Sie vorsichtig, wenn Sie Sop on Collection aufrufen, da dies eine
ConcurrentModification
Ausnahme auslösen kann . Weil die internetoString
Methode jeder Sammlung die Sammlung intern aufruftIterator
.quelle
Sollte für jede Sammlung funktionieren, außer
Map
, aber es ist auch einfach zu unterstützen. Ändern Sie den Code, um diese 3 Zeichen bei Bedarf als Argumente zu übergeben.quelle
Sie können versuchen, mit
quelle
Es gibt zwei Möglichkeiten, wie Sie Ihre Arbeit vereinfachen können. 1. Importieren Sie die Gson-Bibliothek. 2. Verwenden Sie Lombok.
Beide helfen Ihnen beim Erstellen eines Strings aus einer Objektinstanz. Gson analysiert Ihr Objekt, lombok überschreibt Ihr Klassenobjekt in der String-Methode.
Ich habe ein Beispiel für Gson PrettyPrint gegeben. Ich erstelle eine Hilfsklasse zum Drucken von Objekten und zum Sammeln von Objekten. Wenn Sie Lombok verwenden, können Sie Ihre Klasse als @ToString markieren und Ihr Objekt direkt drucken.
}}
quelle