
本文详解如何使用嵌套循环和条件判断,在 java 中动态生成由不同字符构成的矩形框:外层为指定边框字符,内部区域统一填充另一字符。
要实现一个「空心矩形框」(即仅边框用 border 字符,内部全为 interior 字符),关键在于按行列位置精准控制每个字符的输出逻辑——而非简单地整行打印边框。
核心思路是:
- 首行(j == 0)和末行(j == height - 1):全部打印 border;
- 中间行(1 ≤ j ≤ height - 2):仅首列(i == 1)和末列(i == width)打印 border,其余位置打印 interior。
✅ 注意:原代码中内层循环 for (int i = 1; i < width; i++) 的范围是 [1, width),导致每行只输出 width−1 个字符,且起始索引为 1(非 0),易引发边界错位。应改为 i = 1; i <= width 或更直观的 i = 0; i < width(推荐后者,符合 Java 数组/索引惯例)。
以下是优化后的完整可运行代码(含清晰注释与健壮性处理):
import java.util.Scanner;
public class Box {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int width;
int height;
char border;
char interior;
System.out.print("Enter width : ");
width = scnr.nextInt();
System.out.print("Enter height : ");
height = scnr.nextInt();
System.out.print("Enter border : ");
border = scnr.next().charAt(0);
System.out.print("Enter interior : ");
interior = scnr.next().charAt(0);
// 边界校验:确保至少能构成一个有效框(宽高 ≥ 3)
if (width < 3 || height < 3) {
System.out.println("Error: Width and height must be at least 3 to form a hollow box.");
return;
}
// 主绘图循环:逐行、逐列构建
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
// 判断是否为边框位置:首行、末行、首列、末列
if (row == 0 || row == height - 1 || col == 0 || col == width - 1) {
System.out.print(border);
} else {
System.out.print(interior);
}
}
System.out.println(); // 换行
}
}
}运行示例(输入 width=7, height=5, border='X', interior='O'):
立即学习“Java免费学习笔记(深入)”;
XXXXXXX XOOOOOX XOOOOOX XOOOOOX XXXXXXX
? 关键技巧总结:
- 使用 row 和 col 从 0 开始计数,语义清晰且避免 off-by-one 错误;
- 边框判定合并为单个布尔表达式:(row == 0 || row == height-1 || col == 0 || col == width-1),简洁高效;
- 建议添加最小尺寸校验(如 width ≥ 3 && height ≥ 3),防止输入 2×2 导致“无内部空间”的逻辑异常;
- 若需进一步扩展(如居中文字、圆角等),可在此结构上分层封装绘图逻辑。
掌握这一模式,你不仅能绘制矩形框,还能轻松迁移到其他基于网格的 ASCII 图形生成任务中。










