上一篇                     
               
			  Java如何打印空心菱形?
- 后端开发
- 2025-06-17
- 4152
 使用Java打印空心菱形需将图形分为上下两部分:上半部分由递增的空格和星号组成,下半部分递减,关键逻辑是每行仅首尾输出星号,中间填充空格,通过循环控制空格数和星号位置实现空心效果。
 
以下是用Java打印空心菱形的详细方法,包含代码实现、逻辑解释和优化建议,适合不同基础的访客理解:
核心思路
空心菱形由对称的上下三角形组成,关键点在于:
- 空格控制:定位每行起始位置
- 星号规则:首尾位置打印星号,中间用空格填充
- 对称分割:分上半部分(递增)和下半部分(递减)
完整代码实现
import java.util.Scanner;
public class HollowDiamond {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入菱形高度(奇数): ");
        int n = scanner.nextInt();
        // 确保输入为奇数
        if (n % 2 == 0) {
            System.out.println("输入应为奇数,自动转换为 " + (n + 1));
            n += 1;
        }
        int mid = n / 2;  // 中间行索引
        // 打印上半部分(含中间行)
        for (int i = 0; i <= mid; i++) {
            printLine(mid, i, n);
        }
        // 打印下半部分
        for (int i = mid - 1; i >= 0; i--) {
            printLine(mid, i, n);
        }
    }
    private static void printLine(int mid, int i, int total) {
        // 1. 打印前导空格
        for (int j = 0; j < Math.abs(mid - i); j++) {
            System.out.print(" ");
        }
        // 2. 打印第一个星号
        System.out.print("*");
        // 3. 计算中间空格数
        int innerSpace = total - 2 * Math.abs(mid - i) - 2;
        // 4. 打印中间空格和尾星号(非首行)
        if (innerSpace > 0) {
            for (int j = 0; j < innerSpace; j++) {
                System.out.print(" ");
            }
            System.out.print("*");
        }
        // 5. 换行
        System.out.println();
    }
} 
关键逻辑说明
-  输入处理:  - 要求输入奇数高度(偶数自动+1)
- 示例:输入5生成标准菱形
 
-  行数计算: int mid = n / 2; // 示例:n=5时 mid=2(0起索引) 
-  空格规律: 
 | 行号(i) | 前导空格数 | 中间空格数 | 输出示例 |
 |———|————|————|———-|
 | 0 | 2 | -1 | |
 | 1 | 1 | 1 | |
 | 2 | 0 | 3 | | 
-  核心公式: - 前导空格:Math.abs(mid - i)
- 中间空格:总宽度 - 2*前导空格 - 2
- 尾星号条件:中间空格数 > 0
 
- 前导空格:
运行示例
输入高度5时输出:

优化建议
- 动态构建:改用StringBuilder减少IO操作StringBuilder sb = new StringBuilder(); // ... 在方法内追加字符 System.out.print(sb.toString()); 
- 异常处理:添加输入验证 if (n <= 0) { System.out.println("高度必须为正整数"); return; }
- 扩展性:封装打印方法,支持不同字符 void printDiamond(int n, char symbol) { ... }
常见问题解决
- 菱形不对称:确保总行数为奇数
- 多行合并:检查换行符println()是否遗漏
- 首尾行异常:验证innerSpace>0的条件判断
引用说明:本文代码逻辑基于空间几何对称性原则实现,参考《Java编程思想》中循环控制结构的最佳实践,算法通过数学关系式动态计算空格位置,避免硬编码提升可扩展性。
 
  
			