如何在Java中精确控制星号三角形图案的换行以消除多余空行

本文详解如何通过条件判断优化system.out.println()调用,精准控制上下两个对称三角形之间的换行逻辑,彻底消除中间多余的两行空白。

在打印由星号(*)构成的对称三角形图案时,一个常见问题是:上半部分(倒三角)结束后自动换行,下半部分(正三角)开始前又执行了一次换行,导致两者之间出现两行空白

—这正是原代码中未加区分地在每轮外层循环末尾调用 System.out.println() 所致。

关键在于:并非每次内层循环结束后都需要换行。我们需要对“是否该换行”施加逻辑约束:

  • 对于倒三角(从 rows 递减到 1),仅当当前行不是最后一行(即 row > 1) 时才换行;否则(row == 1,即最底端单星号行)不换行,为后续正三角留出衔接空间;
  • 对于正三角(从 0 递增到 rows),仅当当前行尚未达到最大行数(即 row 时才换行;当 row == rows(即最后一行完整星号)后,不再额外换行,避免结尾冗余空行。

以下是优化后的完整示例代码(已采用语义化命名与 0 起始索引,提升可读性与工程规范性):

public class StarPattern {
    public static void main(String[] args) {
        printSymmetricTriangles(4);
    }

    private static void printSymmetricTriangles(int rows) {
        // 上半部分:倒三角(含 rows 行,从满行递减)
        for (int row = rows; row > 0; row--) {
            for (int col = 0; col < row; col++) {
                System.out.print(" * ");
            }
            if (row > 1) { // 关键:最后一行(row == 1)不换行
                System.out.println();
            }
        }

        // 下半部分:正三角(从 1 行递增至 rows 行)
        for (int row = 0; row <= rows; row++) {
            for (int col = 0; col < row; col++) {
                System.out.print(" * ");
            }
            if (row < rows) { // 关键:最大行(row == rows)后不换行
                System.out.println();
            }
        }
    }
}

输出结果(输入 rows = 4):

 *  *  *  * 
 *  *  * 
 *  * 
 * 
 * 
 *  * 
 *  *  * 
 *  *  *  * 

注意事项总结:

  • 避免无条件 System.out.println():它强制插入换行符,是多余空行的根源;
  • 使用 row > 1 和 row = 1 或 row
  • 推荐统一采用 0 起始索引(如 col = 0; col
  • 方法名与变量名应具描述性(如 printSymmetricTriangles、rows),增强代码自解释性。

通过这种精细化的换行控制,你不仅能解决当前的双空行问题,更能建立起对输出流行为的深层理解,为复杂格式化输出打下坚实基础。