2012-01-22 75 views
0

我正在學習Java課,該部分在Enumerations上。我有這個在我的枚舉:枚舉中的等間隔?

public enum tuna { 
Camaro("Orange", "1968"), 
Silverado("Red","1996"), 
Sierra("Black","2007"), 
Equinox("Silver","2011"); 

    private final String color; 
    private final String year; 


tuna(String carColor, String age){ 
    color = carColor; 
    year = age; 

} 
public String getColor(){ 
    return color; 
} 

public String getYear(){ 
    return year; 
} 
} 

,這在我的Java類,打印出來:

for(tuna cars: tuna.values()){ 
    System.out.printf("%s\t\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear() 

打印出:

enter image description here

如何看「紅「和」Silverado「的」1996「在右側(因爲」Silverado「比其他詞語更長)? 那麼我該如何解決這個問題,以便長單詞的細節與其餘單元的間隔相同?

P.S.如果我縮短「的Silverado」到「銀」,這是正常的:

enter image description here

+1

只是一種風格點 - 類應該總是以一個大寫字母開頭字母並遵循CamelCase格式。 –

+0

在你喜歡的百科全書中查找「製表符」的概念。 –

回答

5

我建議不要使用製表符而是字符串格式,即使用System.out.format(...)並通過獲取最長名稱的長度來計算每個格式說明符的長度。然後動態構建格式字符串。

例子:

//that's a shortcut, you'd have to calculate the max 
int maxlength = tuna.Silverado.name().length(); 

for(tuna t : tuna.values()) { 
    System.out.format("%-" + maxlength + "s %-10s %4s\n", t.name(), t.getColor(), t.getYear()); 
} 

輸出:

Camaro  Orange  1968 
Silverado Red  1996 
Sierra  Black  2007 
Equinox  Silver  2011 
+1

+1的工作解決方案。 – Perception

+0

非常感謝! – Cole

3

甲標籤字符內(\t)移動光標前進,直到它到達由製表尺寸整除的位置:如果尺寸例如8,它會變爲0,8,16,24等。由於「Silverado」長度爲9個字符,因此這將導致值爲16,而不是8.

您必須執行自己的選項卡:添加空格基於前面字符串的長度而不是使用\t

如果您想要最簡單的解決方案,請爲每個字段確定一個合適的最大長度,然後基於此計算您的製表符,並選擇性地剪切比這更長的字符串。

對於動態解決方案,您必須根據您可用的項目檢查所需的最大長度。這可以讓您獲得所需的最小間距。

+0

+1有關如何計算標籤的有用信息。 – Perception

-1

這是一個製表符間隔的事情 - 如果您以這種方式使用製表符與文本編輯器,您將獲得相同的結果。對於其中在最大不同變量/分長度由> 4個字符(例如,第一列),插入2個標籤,而不是一個這樣的:

for(tuna cars: tuna.values()){ 
    if (cars.getColor().length() > 5) 
     System.out.printf("%s\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear()) 
    else 
     System.out.printf("%s\t\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear()) 

UPDATE校正爲僅輸出兩個標籤其中顏色ISN太久了。

+0

製表符仍然不可靠。一個更好的解決方案是使用printf在%s字段中使用數字常量來獲得最大的好處。 –

+0

嗯,Silverado後面有兩個標籤。如果我將代碼複製/粘貼到我的代碼中,看看它是否可以修復它,它看起來像這樣:http://i.imgur.com/B5LkY.png – Cole

+0

爲什麼選項卡不可靠?如果使用得當,它們是完全可預測的,用於縮小我們的輸入!與使用空格相比,需要更少的邏輯。 –

0

都不要使用標籤。相反,使用printf可以更好地通過在%s字段中使用int常量來最大化其靈活性。即%10s或%-10s或其他int常數對該列最有效。

0

這與枚舉無關。唯一重要的是這條線:

System.out.printf("%s\t%s\t\t%s\n", cars, cars.getColor(), cars.getYear() 

你需要的是字符串填充。您可以使用System.out.format方法,該方法允許填充格式爲%5s,這意味着它會將字符串填充到最多5個空格。

所以,你可以計算你的字段的最大長度,並動態地構建一個格式字符串:

int maxCars = 0; 
    int maxColor = 0; 
    int maxYear = 0; 

    for(tuna cars: tuna.values()) { 
     maxCars = Math.max(maxCars, cars.toString().length()); 
     maxColor = Math.max(maxColor, cars.getColor().length()); 
     maxYear = Math.max(maxYear, cars.getYear().length()); 
    } 

    String formatStr = "%"+(maxCars+5)+"s%"+(maxColor+5)+"s%"+(maxYear+5)+"s\n"; 

    for(tuna cars: tuna.values()) 
     System.out.format(formatStr, cars, cars.getColor(), cars.getYear()); 

輸出是:

 Camaro  Orange  1968 
    Silverado  Red  1996 
     Sierra  Black  2007 
     Equinox  Silver  2011