1. 概述

Java标准库提供了printf()format()方法,用于在控制台上输出格式化数据。这使得在控制台应用程序中使用ASCII字符创建表格成为可能。此外,还有一个名为AsciiTable的第三方库,进一步简化了这一任务。

在这个教程中,我们将学习如何利用Java标准API和第三方API,使用ASCII字符在Java中创建表格。

2. 项目设置

为了理解如何在Java中将表格输出到控制台,我们首先创建一个简单的项目,它将在控制台上显示一个人的姓名、身高、体重和身体质量指数(BMI)。

首先,创建一个名为BodyMassIndex的类:

class BodyMassIndex {
    private String name;
    private double height;
    private double weight;
 
    // constructor, getters and setters  
 
    double calculate() {
        double bmi = weight / (height * height);
        String formattedBmi = String.format("%.2f", bmi);
        return Double.parseDouble(formattedBmi);
    }
}

在这里,我们创建了一个名为BodyMassIndex的类,其构造函数接受nameheightweight作为参数。还定义了一个名为calculate()的方法来计算BMI。

接下来,我们会创建一个名为BodyMassIndexApplication的新类,其中包含使用BodyMassIndex对象的方法,使用ASCII字符构建表格。

接着,在类中创建BodyMassIndex对象,并将它们存储在一个ArrayList中:

List<BodyMassIndex> bodyMassIndices = new ArrayList<>();
bodyMassIndices.add(new BodyMassIndex("Tom", 1.8, 80));
bodyMassIndices.add(new BodyMassIndex("Elton", 1.9, 90));
bodyMassIndices.add(new BodyMassIndex("Harry", 1.9, 90));
bodyMassIndices.add(new BodyMassIndex("Hannah", 1.9, 90));

在后面的章节中,我们将使用System.out.format()和AsciiTable方法以表格形式在控制台上输出数据。

3. 使用System.out.format()方法

Java的PrintStream对象System.out提供了format()print()等方法,用于将格式字符串输出到控制台,这对于使用ASCII字符构建表格非常有用。这些方法可以精确地放置ASCII字符来绘制线条并定位数据。

3.1. System.out.format()

我们将使用格式说明符来正确地将数据放入正确的列。让我们看一个示例代码,该代码使用ASCII字符向控制台输出表格:

System.out.format("+---------+---------+---------+-------+%n");
System.out.format("| Name    | Height  |  Weight | BMI   |%n");
System.out.format("+---------+---------+---------+-------+%n");
String leftAlignment = "| %-7s | %-7.2f | %-7.2f | %-5.2f |%n";  
for (BodyMassIndex bodyMassIndex : bodyMassIndices) {
    System.out.format(leftAlignment, bodyMassIndex.getName(), bodyMassIndex.getHeight(), bodyMassIndex.getWeight(), bodyMassIndex.calculate());
    System.out.format("+---------+---------+---------+-------+%n");
}

在上述代码中,我们为表格创建了四个列的头部。首先,我们使用加号表示每一列的开始和结束,然后使用破折号绘制水平线。接着,我们使用换行符终止每一行。

此外,我们使用竖线符号绘制垂直线。字符+-|根据表格结构进行排列。

最后,我们声明一个名为leftAlignment的字符串变量,并将其赋值为格式字符串String。格式字符串有助于控制控制台的输出格式。格式字符串包含以下元素:

  • | - 分隔输出中的列
  • %-7s - 帮助左对齐字符串,使用最少的7个字符宽度
  • %-7.2f - 帮助左对齐浮点数,使用最少的7个字符宽度和2位小数
  • %-5.2f - 设置最小字段宽度为5,并保留2位小数
  • %n - 换行符

另外,也可以用System.out.printf()替换System.out.format(),两者效果相同。

3.2. 输出结果

这是生成的表格:

使用format方法控制台输出ASCII表格

控制台显示了使用ASCII字符构建的表格。表格根据我们的规格在控制台上渲染。

4. 使用AsciiTable库

AsciiTable是一个第三方库,可轻松创建美观的ASCII表格。

4.1. AsciiTable库

要在项目中使用AsciiTable库,请将其依赖项添加到pom.xml

<dependency>
    <groupId>de.vandermeer</groupId>
    <artifactId>asciitable</artifactId>
    <version>0.3.2</version>
</dependency>

接下来,看一个使用该库以ASCII格式创建BMI数据表格的示例代码:

AsciiTable asciiTable = new AsciiTable();
asciiTable.addRule();
asciiTable.addRow("Name", "Height", "Weight", "BMI");
asciiTable.addRule();
for (BodyMassIndex bodyMassIndex : bodyMassIndices) {
    asciiTable.addRow(bodyMassIndex.getName(), bodyMassIndex.getHeight(), bodyMassIndex.getWeight(), bodyMassIndex.calculate());
    asciiTable.addRule();
}
asciiTable.setTextAlignment(TextAlignment.CENTER);
String render = asciiTable.render();
System.out.println(render);

在代码中,我们创建一个AsciiTable对象。然后,我们调用@addRule()在其上添加水平线。接着,使用addRow()方法将数据填充到AsciiTable对象中。

此外,AsciiTable类还提供格式化数据的方法。通过在AsciiTable对象上调用setTextAlignment(),我们可以将数据居中对齐。该方法接受枚举作为参数,指定文本对齐方式。

最后,我们调用render(),它返回AsciiTable对象上的字符串。

4.2. 输出结果

这是控制台的输出:

使用asciitable库的控制台输出

AsciiTable库提供了用最少的代码创建美观的控制台ASCII表格的简便方法。

5. 总结

在这篇文章中,我们学习了如何使用内置的System.out.format()方法和AsciiTable库将表格输出到控制台。

两种方法都能完成任务,但使用AsciiTable库时,对列的正确对齐更省力,而System.out.format()方法则提供了更多的样式控制直接性。

如往常一样,示例代码的完整源代码可以在GitHub上找到:GitHub链接