2016-07-09 107 views
0

打印表格的形式,我不知道如何言傳。我試圖在運行後在我的cmd中實現這一點。動態列大小

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 

但現在我的結果是這樣的

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 

事件名稱可長可短,達到用戶輸入。無論事件名稱的長度如何,可以很好地格式化。我的價值都是正確的,只是格式。以下是我的打印代碼。

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++; 
    } 

回答

0

的主要問題是,你沒有指定event字符串的最小長度,因此後續的內容位置取決於這一點。

但爲了避免在未來的問題,我建議你使用固定長度,所以如果你有長度大於最小長度更大的字符串,字符串得到自動截斷,但仍然比對正確。

要指定一個固定的長度,你應該把最小和具有相同值的最大長度;您還可以將字符串與-對齊。

例如%-20.20s

-是左對齊的字符串,否則將被右對齊

20表示最小長度

.20表示最大長度,我們把它等同於最小長度有一個固定長度

在您的例子,你需要決定的所有元素的所需的固定長度的你想顯示(也是event字符串),然後所有東西都應該相應地對齊。

如果你想確保event字符串不被截斷,你會發現它的最大長度在Map,然後使用該值來創建一個格式化的最低或固定長度:

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

所以我只需要找到事件長度的最大長度並相應地更改%-20.20s? –

+0

是的,否則如果你不想找到最大長度,你可以決定一個固定的長度,並最終將字符串截斷,但對齊保持正確。 –