所以我正在编写一个应该为飞机货物建模的类,我在格式化类的toString()方法时遇到了麻烦。以下代码:
public class Cargo
{
private String label;
private int weight, height, width, length;
public String toString()
{
return String.format("%s%s\t\t%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d",
getLabel(), ":", "Weight", "=", getWeight(), "Dimensions",
"=", getHeight(), "X", getWidth(), "X", getLength());
}
public static void main(String[] args)
{
Cargo cargo1 = new Cargo("Bill's Beans", 1200, 20, 15, 30);
Cargo cargo6 = new Cargo("Chicago Bulls", 1000, 10, 10, 10);
Cargo cargo7 = new Cargo("Lots of Meat", 3000, 20, 20, 20);
Cargo cargo8 = new Cargo("Tammy's Tomatoes", 600, 6, 6, 6);
System.out.println(cargo1.toString());
System.out.println(cargo6.toString());
System.out.println(cargo7.toString());
System.out.println(cargo8.toString());
}
}
生成此输出:
Bill's Beans: Weight = 1200 Dimensions = 20 X 15 X 30
Chicago Bulls: Weight = 1000 Dimensions = 10 X 10 X 10
Lots of Meat: Weight = 3000 Dimensions = 20 X 20 X 20
Tammy's Tomatoes: Weight = 600 Dimensions = 6 X 6 X 6
正如你所看到的,除了“Tammy's Tomatoes”之外,一切都很好。我怎样才能解决这个问题?感谢。
答案 0 :(得分:5)
除了“Tammy's Tomatoes”之外,它们都很好地对齐,因为你正在使用标签。 在这种情况下,您的标签长度为4个字符。虽然“Bill's Beans:”是13个字符,“Chicago Bulls:”是14,而“很多肉:”是13,“Tammy's Tomatoes:”是17。
13/4 = 3
14/4 = 3
13/4 = 3
17/4 = 4
或者至少那是程序员的想法;)
因此,当您在最后一个选项卡上放置另一个选项卡时,它会在其余选项卡后启动4个字符。
您可以通过调整标签数量来解决此问题,具体取决于公司名称的字符数。
假设您希望尺寸从第7组4个空格开始。
首先,计算名称占用的空格量。 除以四(如上所述)。
从7中减去数字。
所以Tammy的西红柿将是7-4=3
。
运行一个循环,将3“\ t”添加到结果中(您要添加它们的位置)。
所以最后,你的代码看起来像这样:
String result = String.format("%s%s", getLabel(), ":");
int tabs = result.length()/4;
int desiredTabs = 7;
for(int i = 0; i < desiredTabs-tabs) {
result += "\t";
}
result += String.format("%-7s%-2s%-5d%-11s%-2s%-3d%-2s%-3d%-2s%d",
"Weight", "=", getWeight(), "Dimensions",
"=", getHeight(), "X", getWidth(), "X", getLength());
return result;
编辑回答评论中的问题:
嗯,你真的不需要使用String.format()
。您实际上只需附加变量(例如,result + getWidth()
)。我刚刚使用了String.format()
,因为那是你用过的东西。您可以将其重写为:
String result = String.format("%s%s", getLabel(), ":");
int tabs = result.length()/4;
int desiredTabs = 7;
for(int i = 0; i < desiredTabs-tabs) {
result += "\t";
}
result += "Weight = " + getWeight() + " Dimensions = " + getHeight() + " X " + getWidth() + " X " + getLength();
return result;
更简单:)
答案 1 :(得分:2)
我实际上建议远离标签。在某些情况下,程序会输出到具有不同选项卡设置的位置,并且根据用于对齐输出的选项卡在一般情况下是一个狡猾的前景,这正是您已经遇到的原因。 - 对齐事物取决于知道(或计算)与它们分离的数据的长度。在您的情况下,如果您的标签长度超过28个字符,则计算将失败。
为什么不使用字段的宽度标志来指定标签的宽度,而不是使用制表符?
另外,作为一个建议,我还发现格式字符串更容易阅读(并创建!),如果它只是嵌入了常量:
String formatString = "%17s: Weight = %-5d Dimensions = %-2d X %-2d X %-2d";
String result = String.format(formatString, getWeight(), getHeight(), getWidth(), getLength());
现在,当我查看字符串时,我更容易告诉我放置数据的位置以及整体结果的样子,而不是尝试将常量与其格式字符串相匹配。
无论如何,这是另一种选择。