打印具有动态列大小的表格格式

时间:2016-07-09 16:46:23

标签: java printing format formatter

我不确定如何用文字解释。我想在跑完后在我的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++;
    }

1 个答案:

答案 0 :(得分:0)

主要问题是你没有指定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 ...