
本文详解如何通过条件控制 `system.out.println()` 的执行时机,精准消除上下两个倒正三角形之间多余的两行空白,同时提供命名规范、索引优化等专业编码建议。
在 Java 控制台输出图形时,System.out.println() 每次调用都会换行(即插入一个 \n)。观察原始代码:两个嵌套 for 循环末尾无条件调用 System.out.println(),导致每个三角形的最后一行后仍额外输出一次换行——上三角末尾多出一行,下三角开头又多出一行,合计形成两行空白间隙。
解决核心在于:仅在需要换行时才调用 println(),跳过“最后一行之后”的冗余换行。
以下为优化后的完整实现(已重构为清晰、可维护的结构):
public class TrianglePrinter {
public static void main(String[] args) {
printHourglassPattern(4);
}
private static void printHourglassPattern(int rows) {
// 上半部分:倒三角(从 rows 行递减到 1 行)
for (int row = rows; row >= 1; row--) {
for (int col = 0; col < row; col++) {
System.out.print(" * ");
}
if (row > 1) { // 最后一行(row == 1)不换行,避免多余空行
System.out.println();
}
}
// 下半部分:正三角(从 1 行递增到 rows 行)
for (int row = 1; row <= rows; row++) {
for (int col = 0; col < row; col++) {
System.out.print(" * ");
}
if (row < rows) { // 最后一行(row == rows)不换行,衔接紧密
System.out.println();
}
}
// 注意:此处无需额外 println() —— 整体输出自然结束
}
}✅ 关键改进说明:
- 使用语义化变量名(rows, row, col)替代 a, row, col 等单字母命名;
- 统一采用 0 起始索引(col
- 每个内层循环后添加条件判断:仅当当前行不是该三角形的最后一行时才换行;
- 将方法抽取为 printHourglassPattern(int rows),提升复用性与可测试性。
⚠️ 注意事项:
- 若需用户输入,取消注释 Scanner 相关代码,并确保在 main 中调用前初始化;
- 输出末尾不会有多余空行,但若需强制结尾换行(如日志对齐),可在方法最后单独加 System.out.println();;
- 当 rows = 1 时,上下三角合并为单行 *,逻辑仍健壮(因 row > 1 和 row
运行结果(rows = 4):
* * * * * * * * * * * * * * * * * * * *
可见中间仅保留一行分隔空行(由上三角末行后无换行 + 下三角首行前无换行自然形成),彻底消除原始问题中的两行冗余空白。










