在Java编程中,打印二维数组是常见的操作需求,而输出乘法表这类需要对齐内容的场景,对格式化打印的要求更高,需要让每列内容保持整齐的间距,避免输出错乱。本文将通过乘法表的实现,介绍几种优雅的二维数组格式化打印方法。

基础嵌套循环打印方案
最基础的思路是使用两层for循环遍历二维数组,外层控制行,内层控制列,直接拼接内容后打印。我们先定义一个存储乘法表结果的二维数组,再遍历输出。
public class ArrayPrintDemo {
public static void main(String[] args) {
// 定义9行9列的二维数组存储乘法表
String[][] multiplicationTable = new String[9][9];
// 填充乘法表内容
for (int i = 0; i < 9; i++) {
for (int j = 0; j <= i; j++) {
multiplicationTable[i][j] = (j + 1) + "*" + (i + 1) + "=" + ((j + 1) * (i + 1));
}
}
// 基础遍历打印
for (int i = 0; i < 9; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(multiplicationTable[i][j] + "t");
}
System.out.println();
}
}
}
上述代码使用制表符<tab>分隔每列内容,能基本实现对齐,但如果结果位数不同,比如1*1=1和3*9=27,制表符的间距可能不够统一,输出效果不够美观。
使用String.format优化对齐
可以通过String.format方法指定每个单元格的宽度,保证所有内容占用的字符数一致,实现更精准的对齐效果。
public class ArrayPrintDemo {
public static void main(String[] args) {
String[][] multiplicationTable = new String[9][9];
// 填充内容时直接格式化每个单元格
for (int i = 0; i < 9; i++) {
for (int j = 0; j <= i; j++) {
int num1 = j + 1;
int num2 = i + 1;
int result = num1 * num2;
// 每个单元格固定占8个字符宽度,左对齐
multiplicationTable[i][j] = String.format("%-8s", num1 + "*" + num2 + "=" + result);
}
}
// 打印二维数组
for (int i = 0; i < 9; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(multiplicationTable[i][j]);
}
System.out.println();
}
}
}
这里%-8s表示将字符串左对齐,占用8个字符的宽度,不足的部分用空格补齐,这样不管乘法结果是多少位,每列的起始位置都一致,输出会更整齐。
封装通用打印方法
如果后续还有其他二维数组需要格式化打印,可以把打印逻辑封装成通用方法,提升代码复用性。
public class ArrayPrintDemo {
// 通用二维数组格式化打印方法,参数是二维数组和每个单元格的宽度
public static void printFormattedArray(String[][] array, int cellWidth) {
for (String[] row : array) {
for (String cell : row) {
if (cell != null) {
// 格式化每个单元格
System.out.print(String.format("%-" + cellWidth + "s", cell));
}
}
System.out.println();
}
}
public static void main(String[] args) {
String[][] multiplicationTable = new String[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j <= i; j++) {
int num1 = j + 1;
int num2 = i + 1;
multiplicationTable[i][j] = num1 + "*" + num2 + "=" + (num1 * num2);
}
}
// 调用通用方法打印,指定每个单元格宽度为8
printFormattedArray(multiplicationTable, 8);
}
}
这个通用方法可以适配任意字符串类型的二维数组,只需要传入数组和期望的单元格宽度即可,不需要重复编写遍历和格式化逻辑。
不同方案对比
以下是几种方案的适用场景对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 制表符分隔 | 实现简单,代码量少 | 对齐效果不稳定,内容位数不同时容易错位 | 临时调试输出,对格式要求不高的场景 |
| String.format固定宽度 | 对齐效果精准,输出美观 | 需要提前确定单元格宽度 | 正式输出场景,比如打印乘法表、报表类内容 |
| 通用方法封装 | 复用性高,代码易维护 | 需要额外定义方法 | 多个二维数组需要格式化打印的项目 |
实际开发中可以根据需求选择合适的方案,追求简单可以用制表符,需要美观稳定的输出建议用固定宽度的格式化方式,项目中有多处类似需求则可以封装通用方法。