2013-03-02 11 views
7

Ich möchte den Inhalt meiner Maps (hübsch) drucken können.Mehrzeiliges Pretty-Printing von (verschachtelten) Collections in Java

Sie sollten Zeilenumbrüche und Einrückungen haben und nicht auf einer einzelnen Zeile; Ignorieren der toString-Methoden von Collections/iterables/etc; und rekursive in verschachtelte Sammlungen.

Dies ist besonders interessant für mich in Bezug auf Karten. Ich nehme an, JSON'ing könnte relevant sein, aber ich möchte nicht so weit gehen, oder zumindest - ich möchte nicht, dass mein Code über JSON weiß, nur damit ich ihn schön ausdrucken kann. Was sind meine Möglichkeiten (außer dies selbst zu schreiben)?

Antwort

15

können Sie die Methode verwenden MapUtils.debugPrint aus den apache commons Sammlungen, um verschachtelte Karten zu drucken.

Diese Methode druckt einen gut formatierten String, der die Map beschreibt. Jeder Karteneintrag wird mit Schlüssel-, Wert- und Wertklassennamen gedruckt. Wenn der Wert eine Map ist, tritt rekursives Verhalten auf.

+1

Link funktioniert nicht, versuchen Sie dies - http://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/collections/MapUtils.html – gauravphoenix

+0

@ gauravphoenix Ich habe aktualisiert der Link. Beachten Sie, dass Sie mit der Version 2.1.1 verbunden sind, während es auch eine Version 3.2.1 gibt. (Die 4.0 ist immer noch Alpha) – lbalazscs

1

Ich bin nicht 100% sicher, könnte sein, ist es das, was Sie suchen, und die aufgerufen Sie ziemlich Druck -

Map<Integer,String> map = new HashMap<Integer,String>(); 
... 
for(Map.Entry<Integer,String> entry: map.entrySet()){ 
    System.out.println(entry.getKey()+" - "+ entry.getValue()); 
} 
+0

Dies tut nicht Einzug und hilft mir nicht mit verschachtelten Karten (oder anderen Sammlungen). – einpoklum

+0

Es ist nur eine Iteration über eine einzelne Karte. Falls Sie eine geschachtelte Sammlung haben, könnten Sie eine verschachtelte Schleife darin verwenden. –

3

Versuchen Sie, den Beginn jeder Eintrag mit neuen Zeile und Tab wie folgt ersetzt

myMap.toString().replace("[", "\n\t[");

+0

Dieser Ansatz fehlt die richtige Identifizierung von Leerzeichen. –

1

Ich suchte nach einem Druck von verschachtelten Sammlungen in Java, die mich hierher gebracht haben. Die Antworten funktionieren jedoch nur für Maps. Daher dachte ich, ich würde meine Lösung für verschachtelte Sammlungen hinzufügen. Es erzeugt eine JSON-ähnliche Ausgabe, wenn Sie möchten, dass Zeilenumbrüche "] \ n" statt "]" hinzufügen.

Beachten Sie, dass dies keine schöne Ausgabe erzeugt, wenn das Objekt [] verschachtelte Elemente enthält. Sie müssten eine separate Methode schreiben, um mit verschachtelten Arrays umzugehen. Außerdem werden primitive Arrays nicht hübsch gedruckt, da Sie für jeden primitiven Array-Typ eine else-Anweisung benötigen.

private static <A extends Collection<B>, B> String nestedToString(A collection) { 
    if (collection == null) 
     return "null"; 

    String ret = ""; 

    Iterator<B> colIterator = collection.iterator(); 
    if (colIterator.hasNext()) { 
     ret += '['; 
     while (colIterator.hasNext()) { 
      B object = colIterator.next(); 
      if (object == null) { 
       ret += "null"; 
      } else if (object instanceof Collection) { 
       ret += nestedToString((Collection) object); 
      } else if (object instanceof Object[]) { 
       ret += Arrays.deepToString((Object[]) object); 
      } else { 
       ret += object; 
      } 
      if (colIterator.hasNext()) { 
       ret += ", "; 
      } 
     } 
     ret += ']'; 
    } 
    return ret; 
}