使用动态列大小打印 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 ...