2016-07-09 20 views
0

Ich weiß nicht, wie ich das in Worten erklären soll. Ich versuche dies in meinem CMD nach dem Laufen zu erreichen.Drucktabellenformat mit dynamischer Spaltengröße

Event     Average  Stdev Weight 
Logins     4.50  1.25 2 
Total time online  287.15  42.12 1 
Emails sent    65.40  30.71 1 
Orders processed  150.73  20.13 1 
Pizza's ordered online 2.03  1.06 0.5 

Aber jetzt mein Ergebnis wie dieses, ist

Event    Average    Stdev    Weight 
Logins     3.33     1.25     2.0 
Time Online    335.33    33.52     1.0 
Emails Sent    66.00    15.51     1.0 
Orders processed    150.67    17.25     1.0 
Pizza's Ordered     2.33     1.25     0.5 

Der Ereignisname lang oder kurz sein kann

ist bis auf eine Benutzereingabe. Ist es möglich, unabhängig von der Länge des Ereignisnamens schön zu formatieren? Mein Wert ist alles richtig, ist nur die Formatierung. Unten ist mein Druckcode.

Formatter formatter = new Formatter(); 
    System.out.println(formatter.format("%s %20s %20s %20s", "Event", "Average", "Stdev", "Weight")); 
    int count = 0; 
    for (Map.Entry<String, Double> entry : eventsMap.entrySet()) { 
     formatter = new Formatter(); 
     String event = entry.getKey(); 
     double weight = entry.getValue();   
     System.out.println(formatter.format("%s %20s %20s %20s", event, average[count], stdev[count], weight)); 
     count++; 
    } 

Antwort

0

Das Hauptproblem ist, dass Sie nicht die minimale Länge der event Schnur, damit die nachfolgenden Positionen Inhalt hängen davon ab, dass angab.

Aber um Probleme in der Zukunft zu vermeiden, würde ich vorschlagen, dass Sie feste Längen verwenden, wenn Sie also eine Zeichenfolge mit Länge größer als die Mindestlänge haben, wird die Zeichenfolge automatisch abgeschnitten, aber die Ausrichtungen bleibt korrekt.

Um eine feste Länge anzugeben, sollten Sie sowohl die minimale als auch die maximale Länge mit dem gleichen Wert eingeben; Sie können die Strings auch mit - ausrichten.

Zum Beispiel %-20.20s:

- ist die Zeichenfolge nach links ausrichten, sonst wird es richtig

20 gibt die minimale Länge

.20 gibt die maximale Länge ausgerichtet werden, wir setzen es gleich zu die minimale Länge um eine feste Länge zu haben

In Ihrem Beispiel müssen Sie die gewünschten festen Längen aller Elemente bestimmen möchte angezeigt werden (auch die event Zeichenfolge) und dann sollte alles entsprechend ausgerichtet werden.

Wenn Sie wollen sicher sein, dass die event Zeichenfolge abgeschnitten nicht erhalten Sie seine maximale Länge in Ihrem Map und dann diesen Wert verwenden finden konnten, die minimale oder fester Länge für den Formatierer zu erstellen:

int eventMaxLength = ... // assign the max length 
String eventFormat = "%-" + eventMaxLength + "." + eventMaxLength + "s"; 
System.out.println(formatter.format(eventFormat + " %-20.20s %-20.20s ... 
+0

Also muss ich nur die maximale Länge für die Ereignislänge finden und die% -20.20s entsprechend ändern, oder? –

+0

Ja, andernfalls, wenn Sie nicht die maximale Länge finden möchten, können Sie eine feste Länge festlegen und schließlich die Zeichenfolge abgeschnitten werden, aber die Ausrichtungen bleiben korrekt. –