2012-01-22 14 views
0

私はJavaレッスンで作業していましたが、そのセクションは列挙型です。私のJavaクラスで列挙型の等間隔?

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

と、このそれを印刷している:

出力し
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

はどのように「赤を参照してください。 "と" 1996 "はSilveradoの方が右です(" Silverado "は他の言葉より長いので)? 長い単語の詳細が残りの部分と同じようになるように修正するにはどうすればよいですか?

P.S.私は「シルバー」に「シルバラード」を短縮​​した場合、それが普通です:

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

それはタブのサイズで割り切れる位置に到達するまで、タブcharcter(\t)が先にカーソルを移動します。サイズは、例えばある場合8は、0、8、16、24などになります。 "Silverado"は9文字なので、これは8でなく16の値になります。

あなた自身のタブを行う必要があります:スペースを追加する\tではなく、直前の文字列の長さに基づいています。

最も簡単な解決方法を知りたい場合は、各フィールドに適した最大長を決め、それに基づいてタブを計算します。オプションでこれより長い文字列を省略することもできます。

動的ソリューションの場合、使用可能なアイテムに基づいて必要な最大長を確認する必要があります。これにより、必要な間隔の最小値を取得できます。

+0

+1は、タブの計算方法に関する有用な情報です。 – Perception

-1

これはタブ間隔のことです。この方法でタブをテキストエディタで使用すると同じ結果が得られます。 MAXで異なる変数に/分(例えば最初のカラム)> 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()) 

のみ出力する色ISN 2つのタブが修正UPDATEあまりにも長すぎます。

+0

タブは依然として信頼性がありません。もっと良い解決策は、%sフィールドの数値定数を使ってprintfを最大限に活用することです。 –

+0

Silveradoの後に2つのタブがあります。そして、私のコードをコピーしてそれを修正するかどうかを確認するには、次のようになります: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