理解空心菱形的结构特点
在开始编写Java代码之前,首先需要明确空心菱形的结构特征,空心菱形由上下两个对称的三角形组成,中间通过一条水平线连接,上半部分是一个倒三角形,下半部分是一个正三角形,且两者共享中间的一条水平线,菱形的每一行由空格和特定字符(如星号“*”)组成,空格的数量和星号的位置随着行数的变化而变化,关键在于确定每一行空格和星号的分布规律,确保菱形中间是空心的,即只有边界有星号,内部为空格。

分析菱形的行数与字符分布规律
假设菱形的总行数为n(通常为奇数,以确保对称性),我们可以将菱形分为上半部分(包括中间行)、下半部分和中间行三部分,以n=5为例,菱形结构如下:
观察可知,上半部分(前3行)的规律是:第i行(i从1开始)的空格数为(n//2 – i + 1),星号数量为2(首尾各一个),中间用空格填充,下半部分(后2行)的规律与上半部分对称,空格数逐渐增加,星号位置逐渐靠近中心,中间行(第3行)的星号位于首尾,中间为空格。
编写Java代码的基本思路
基于上述分析,编写Java代码的核心思路是使用循环控制每一行的输出,具体步骤如下:
- 确定菱形的行数:通常选择奇数,如5、7等,以确保对称性。
- 循环遍历每一行:分为上半部分、中间行和下半部分三部分处理。
- 计算每一行的空格和星号数量:根据当前行数确定空格和星号的位置。
- 拼接字符串并输出:使用字符串拼接或循环输出空格和星号。
实现代码的上半部分
上半部分包括从第一行到中间行的所有行,以n=5为例,上半部分为前3行,对于第i行(i从1到n//2 + 1),空格数为(n//2 – i + 1),星号数量为2(首尾各一个),中间用空格填充,代码实现如下:

for (int i = 1; i <= n / 2 + 1; i++) {
// 打印前导空格
for (int j = 1; j <= n / 2 - i + 1; j++) {
System.out.print(" ");
}
// 打印星号和中间空格
System.out.print("*");
if (i != n / 2 + 1) { // 中间行不打印中间空格
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print(" ");
}
}
System.out.println("*");
}
实现代码的下半部分
下半部分包括从中间行+1到最后一行的所有行,以n=5为例,下半部分为后2行,对于第i行(i从n/2 + 2到n),空格数为(i – n/2 – 1),星号数量为2(首尾各一个),中间用空格填充,代码实现如下:
for (int i = n / 2 + 2; i <= n; i++) {
// 打印前导空格
for (int j = 1; j <= i - n / 2 - 1; j++) {
System.out.print(" ");
}
// 打印星号和中间空格
System.out.print("*");
for (int j = 1; j <= 2 * (n - i) + 1; j++) {
System.out.print(" ");
}
System.out.println("*");
}
完整代码示例与优化
将上述两部分代码合并,并添加用户输入行数的功能,可以得到完整的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("请输入奇数!");
return;
}
// 上半部分
for (int i = 1; i <= n / 2 + 1; i++) {
for (int j = 1; j <= n / 2 - i + 1; j++) {
System.out.print(" ");
}
System.out.print("*");
if (i != n / 2 + 1) {
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print(" ");
}
}
System.out.println("*");
}
// 下半部分
for (int i = n / 2 + 2; i <= n; i++) {
for (int j = 1; j <= i - n / 2 - 1; j++) {
System.out.print(" ");
}
System.out.print("*");
for (int j = 1; j <= 2 * (n - i) + 1; j++) {
System.out.print(" ");
}
System.out.println("*");
}
}
}
代码逻辑的详细解释
- 输入处理:使用
Scanner类获取用户输入的行数,并检查是否为奇数,如果不是奇数,提示用户重新输入。 - 上半部分循环:
- 外层循环控制行数,从1到
n/2 + 1(中间行)。 - 第一个内层循环打印前导空格,数量为
n/2 - i + 1。 - 打印第一个星号,然后判断是否为中间行,如果不是,打印中间空格(数量为
2 * i - 1),再打印第二个星号。
- 外层循环控制行数,从1到
- 下半部分循环:
- 外层循环控制行数,从
n/2 + 2到n。 - 第一个内层循环打印前导空格,数量为
i - n/2 - 1。 - 打印第一个星号,然后打印中间空格(数量为
2 * (n - i) + 1),再打印第二个星号。
- 外层循环控制行数,从
测试与验证
为了验证代码的正确性,可以输入不同的奇数行数进行测试。
- 输入3,输出:
- 输入7,输出:
通过测试可以确认代码能够正确打印出空心菱形,且结构对称、边界清晰。

可能的优化与扩展
- 使用StringBuilder优化字符串拼接:在循环中频繁使用
System.out.print可能会影响性能,可以使用StringBuilder拼接字符串后一次性输出。 - 支持自定义字符:可以修改代码,允许用户选择使用其他字符(如“#”、“+”等)代替星号。
- 增加异常处理:对用户输入进行更严格的验证,如确保输入为正整数且为奇数。
通过分析空心菱形的结构特点,合理划分上下半部分,并利用循环控制空格和星号的输出位置,可以高效地用Java实现空心菱形的打印,关键在于理解菱形的对称性和每一行的字符分布规律,并通过循环和条件判断精确控制输出,完整的代码不仅实现了基本功能,还具备良好的可读性和可扩展性,为后续优化提供了基础。




















