枚举中的等间距是否等于?

时间:2012-01-22 21:44:16

标签: java enums enumeration

我正在学习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

看看西尔弗拉多的“红色”和“1996”是如何在右边过去的(因为“西尔维拉多”比其他词更长)? 那我怎么能解决这个问题,所以长词的细节与其余词的间距相等?

P.S。如果我将“Silverado”缩短为“Silver”,这是正常的:

enter image description here

5 个答案:

答案 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 :(得分:3)

选项卡字符(\t)向前移动光标,直到它到达可被制表符大小整除的位置:如果大小为例如8,它将变为0,8,16,24等。由于“Silverado”长度为9个字符,因此这将导致值16而不是8。

你必须自己做标签:根据前面字符串的长度添加空格,而不是使用\t

如果您想要最简单的解决方案,请为每个字段确定合适的最大长度,并根据该字段计算标签,可选择切断长于此字符串的字符串。

对于动态解决方案,您必须根据可用的项目检查所需的最大长度。这使您可以获得所需的最小间距。

答案 2 :(得分:0)

根本不使用标签。而是通过在%s字段中使用int常量来更好地使用printf来最大化其灵活性。即,%10s或%-10s或任何int常量最适合该列。

答案 3 :(得分: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

答案 4 :(得分:-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())

更新更正为仅输出颜色不够长的两个标签。