1. Overview
1.概述
The Java standard library provides the printf() and format() methods to output formatted data to the console. These two methods make it possible to create a table using ASCII characters in a console app. Also, there’s a third-party library named AsciiTable that further simplifies the task.
Java 标准库提供了 printf() 和 format() 方法,用于向控制台输出格式化数据。这两个方法使得在控制台应用程序中使用 ASCII 字符创建表格成为可能。此外,还有一个名为 AsciiTable 的第三方库可以进一步简化这一任务。
In this tutorial, we’ll learn how to use the Java standard API and a third-party API to create a table using ASCII characters in Java.
在本教程中,我们将学习如何使用 Java 标准 API 和第三方 API 在 Java 中使用 ASCII 字符创建表格。
2. Project Setup
2.项目设置
To understand how to output a table to the console in Java, let’s create a simple project that outputs a person’s name, height, weight, and body mass index (BMI) to the console.
为了了解如何在 Java 中将表格输出到控制台,让我们创建一个简单的项目,将一个人的姓名、身高、体重和身体质量指数 (BMI) 输出到控制台。
First, let’s create a class named BodyMassIndex:
首先,让我们创建一个名为 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);
}
}
Here, we create a class named BodyMassIndex. Its constructor accepts name, height, and weight as parameters. Also, we define a method named calculate() to compute body mass index.
在这里,我们创建一个名为 BodyMassIndex 的类。它的构造函数接受 name, height, 和 weight 作为参数。此外,我们还定义了一个名为calculate()的方法来计算体重指数。
We’ll also create a new class named BodyMassIndexApplication, which will have methods that use the BodyMassIndex object to construct a table using ASCII characters.
我们还将创建一个名为 BodyMassIndexApplication 的新类,该类的方法将使用 BodyMassIndex 对象来使用 ASCII 字符构建表格。
Next, let’s create BodyMassIndex objects in the class and store them in an ArrayList:
接下来,让我们在类中创建 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));
In the subsequent sections, we’ll output the data in a tabular form to the console using System.out.format() and AsciiTable.
在随后的章节中,我们将使用 System.out.format() 和 AsciiTable 将数据以表格形式输出到控制台。
3. Using the System.out.format() Method
3.使用 System.out.format() 方法
The Java PrintStream object System.out provides methods like format() and print() to output format string to the console. Both are handy for constructing a table using ASCII characters. We can use these methods to carefully place ASCII characters to draw lines and position data.
Java PrintStream 对象 System.out 提供了 format() 和 print() 等方法,用于向控制台输出格式字符串。这两个方法对于使用 ASCII 字符构建表格非常方便。我们可以使用这些方法仔细放置 ASCII 字符,以绘制线条和定位数据。
3.1. System.out.format()
3.1.System.out.format()
We’ll use format specifiers to place the data in the right column correctly. Let’s see an example code that outputs a table to the console using ASCII characters:
我们将使用格式规范将数据正确放置在右栏。让我们来看一个使用 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");
}
In the code above, we create a header of four columns for the table. First, we use the plus sign to show the beginning and ending of each column. Next, we use hyphens to draw horizontal lines. Then, we use the newline character to terminate each line.
在上面的代码中,我们为表格创建了一个包含四列的标题。首先,我们使用加号来显示每列的开始和结束。接着,我们使用连字符绘制水平线。然后,使用换行符结束每一行。
Furthermore, we use the pipe sign to draw a vertical line. The characters +, –, and | signs are arranged based on the structure of the table.
此外,我们还使用管道符号来画垂直线。字符 +、– 和 | 符号是根据表格的结构排列的。
Finally, we declare a string variable named leftAlignment and assign it with values of format String. The format string helps format output to the console. The format string contains the following elements:
最后,我们声明一个名为 leftAlignment 的字符串变量,并为其赋值 String 格式。格式字符串有助于格式化输出到控制台。格式字符串包含以下元素:
- | – Separate the columns in the output
- %-7s – Helps to left-align a string and use a minimum field width of 7 characters
- %-7.2f – Helps to left-align a float and to use a minimum field width of 7 characters and 2 decimal places
- %-5.2f – Helps set the minimum field width to 5 and 2 decimal places
- %n – Newline character
Alternatively, we can use System.out.printf() in place of System.out.format(). Both methods provide the same result.
另外,我们可以使用 System.out.printf() 代替 System.out.format() 。这两种方法提供的结果是一样的。
3.2. The Output
3.2.输出
Here’s the generated table:
下面是生成的表格:
The console displays a table constructed using ASCII characters. The table is rendered on the console based on our specifications.
控制台显示一个使用 ASCII 字符构建的表格。控制台将根据我们的要求显示表格。
4. Using the AsciiTable Library
4.使用 AsciiTable 库
AsciiTable is a third-party library that makes it easy to create a nice-looking ASCII table.
AsciiTable 是一个第三方库,可轻松创建美观的 ASCII 表格。
4.1. The AsciiTable Library
4.1.AsciiTable 库
To use the AsciiTable library, let’s add its dependency to the pom.xml:
要使用 AsciiTable 库,让我们将其 依赖关系添加到 pom.xml 中:
<dependency>
<groupId>de.vandermeer</groupId>
<artifactId>asciitable</artifactId>
<version>0.3.2</version>
</dependency>
Next, let’s see an example code that uses the library to create the BMI data table in ASCII format:
接下来,让我们看看使用该库创建 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);
In the code above, we create an AsciiTable object. Next, we invoke @addRule() on it to add a horizontal line. Then, we use the addRow() method to populate the AsciiTable table object with data.
在上面的代码中,我们创建了一个 AsciiTable 对象。然后,我们调用 @addRule() 来添加一条水平线。然后,我们使用 addRow() 方法向 AsciiTable 表对象填充数据。
Also, the AsciiTable class provides methods to format the data. We align the data to the center by invoking the setTextAlignment() on the AsciiTable object. The method accepts enum as an argument to specify the text alignment.
此外,AsciiTable类还提供了格式化数据的方法。我们通过调用 AsciiTable 对象上的 setTextAlignment() 将数据对齐到中心。该方法接受 enum 作为参数来指定文本对齐方式。
Finally, we invoke the render(), which returns a string on the AsciiTable object.
最后,我们调用 render(),它会返回 AsciiTable 对象的字符串。
4.2. The Output
4.2.输出
Here’s the output on the console:
下面是控制台的输出结果:
The AsciiTable library provides an easy way to create nice-looking ASCII tables for the console with minimal code.
AsciiTable 库提供了一种简便的方法,能以最少的代码为控制台创建美观的 ASCII 表格。
5. Conclusion
5.结论
In this article, we learned how to output a table to the console using the built-in System.out.format() method and the AsciiTable library.
在本文中,我们学习了如何使用内置的 System.out.format() 方法和 AsciiTable 库将表格输出到控制台。
Both methods provide a working way to achieve the task. However, while using the AsciiTable library requires less work to align columns properly, the System.out.format() method gives more direct control over styling.
这两种方法都提供了实现任务的可行方法。不过,虽然使用 AsciiTable 库需要较少的工作来正确对齐列,但 System.out.format() 方法可以更直接地控制样式。
As usual, the complete source code for the examples is available over on GitHub.
与往常一样,这些示例的完整源代码可在 GitHub 上获取。