Java 枚举中的等间距?

Java 枚举中的等间距?,java,enums,enumeration,Java,Enums,Enumeration,我在上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)

我在上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;
 }
}
在我的Java类中,这是打印出来的:

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

看看右边的红色和1996年的Silverado,因为Silverado比其他单词长? 那么,我如何修复它,使长单词的细节与其他单词的间距相等

另外,如果我把Silverado缩短为Silver,这是正常的:

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

您必须自己进行制表:根据前面字符串的长度添加空格,而不是使用\t

如果您想要最简单的解决方案,请为每个字段确定一个合适的最大长度,并在此基础上计算您的制表符,可以选择删除比此长度更长的字符串


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

这是一个制表符间距问题-如果您在文本编辑器中以这种方式使用制表符,您将获得相同的间距。对于最大/最小长度相差>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())

更新已更正,仅输出颜色不够长的两个选项卡。

我建议不要使用选项卡,而是使用字符串格式,即使用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

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

这与枚举无关。唯一重要的是这一行:

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

只是一个样式点-类应该总是以大写字母开头,并遵循CamelCase格式。在你最喜欢的百科全书中查找制表器的概念。制表器仍然不可靠。一个更好的解决方案是在%s字段中使用数字常量来最大限度地利用printf。如果我将你的代码复制/粘贴到我的代码中,看看它是否能修复它,它看起来是这样的:为什么标签不可靠?如果使用得当,它们是完全可预测的,用于像这样缩进我们的输出!与使用空格相比,需要的逻辑更少。