我正在学习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()
打印出来:
看看西尔弗拉多的“红色”和“1996”是如何在右边过去的(因为“西尔维拉多”比其他词更长)? 那我怎么能解决这个问题,所以长词的细节与其余词的间距相等?
P.S。如果我将“Silverado”缩短为“Silver”,这是正常的:
答案 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())
更新更正为仅输出颜色不够长的两个标签。