使用动态列大小打印 table 格式
Print table format with dynamic column size
我不知道如何用语言解释。在 运行.
之后,我试图在我的 cmd 中实现这一点
Event Average Stdev Weight
Logins 4.50 1.25 2
Total time online 287.15 42.12 1
Emails sent 65.40 30.71 1
Orders processed 150.73 20.13 1
Pizza's ordered online 2.03 1.06 0.5
但是现在我的结果是这样的
Event Average Stdev Weight
Logins 3.33 1.25 2.0
Time Online 335.33 33.52 1.0
Emails Sent 66.00 15.51 1.0
Orders processed 150.67 17.25 1.0
Pizza's Ordered 2.33 1.25 0.5
事件名称可长可短,由用户输入。无论事件名称长度如何,都可以很好地格式化。我的值都是正确的,只是格式。下面是我的打印代码。
Formatter formatter = new Formatter();
System.out.println(formatter.format("%s %20s %20s %20s", "Event", "Average", "Stdev", "Weight"));
int count = 0;
for (Map.Entry<String, Double> entry : eventsMap.entrySet()) {
formatter = new Formatter();
String event = entry.getKey();
double weight = entry.getValue();
System.out.println(formatter.format("%s %20s %20s %20s", event, average[count], stdev[count], weight));
count++;
}
主要问题是您没有指定 event
字符串的最小长度,因此后续内容位置取决于此。
但为了避免将来出现问题,我建议您使用固定长度,因此如果您的字符串长度大于最小长度,该字符串会自动截断但对齐方式保持正确。
要指定固定长度,您应该将最小和最大长度设置为相同的值;您还可以将字符串与 -
左对齐。
例如%-20.20s
:
-
就是要左对齐字符串,否则就是右对齐
20
表示最小长度
.20
表示最大长度,我们把它等于最小长度来固定长度
在您的示例中,您需要确定要显示的所有元素(以及 event
字符串)所需的固定长度,然后所有内容都应相应对齐。
如果您想确保 event
字符串不会被截断,您可以在 Map
中找到它的最大长度,然后使用该值创建最小或固定长度格式化程序:
int eventMaxLength = ... // assign the max length
String eventFormat = "%-" + eventMaxLength + "." + eventMaxLength + "s";
System.out.println(formatter.format(eventFormat + " %-20.20s %-20.20s ...
我不知道如何用语言解释。在 运行.
之后,我试图在我的 cmd 中实现这一点Event Average Stdev Weight
Logins 4.50 1.25 2
Total time online 287.15 42.12 1
Emails sent 65.40 30.71 1
Orders processed 150.73 20.13 1
Pizza's ordered online 2.03 1.06 0.5
但是现在我的结果是这样的
Event Average Stdev Weight
Logins 3.33 1.25 2.0
Time Online 335.33 33.52 1.0
Emails Sent 66.00 15.51 1.0
Orders processed 150.67 17.25 1.0
Pizza's Ordered 2.33 1.25 0.5
事件名称可长可短,由用户输入。无论事件名称长度如何,都可以很好地格式化。我的值都是正确的,只是格式。下面是我的打印代码。
Formatter formatter = new Formatter();
System.out.println(formatter.format("%s %20s %20s %20s", "Event", "Average", "Stdev", "Weight"));
int count = 0;
for (Map.Entry<String, Double> entry : eventsMap.entrySet()) {
formatter = new Formatter();
String event = entry.getKey();
double weight = entry.getValue();
System.out.println(formatter.format("%s %20s %20s %20s", event, average[count], stdev[count], weight));
count++;
}
主要问题是您没有指定 event
字符串的最小长度,因此后续内容位置取决于此。
但为了避免将来出现问题,我建议您使用固定长度,因此如果您的字符串长度大于最小长度,该字符串会自动截断但对齐方式保持正确。
要指定固定长度,您应该将最小和最大长度设置为相同的值;您还可以将字符串与 -
左对齐。
例如%-20.20s
:
-
就是要左对齐字符串,否则就是右对齐
20
表示最小长度
.20
表示最大长度,我们把它等于最小长度来固定长度
在您的示例中,您需要确定要显示的所有元素(以及 event
字符串)所需的固定长度,然后所有内容都应相应对齐。
如果您想确保 event
字符串不会被截断,您可以在 Map
中找到它的最大长度,然后使用该值创建最小或固定长度格式化程序:
int eventMaxLength = ... // assign the max length
String eventFormat = "%-" + eventMaxLength + "." + eventMaxLength + "s";
System.out.println(formatter.format(eventFormat + " %-20.20s %-20.20s ...