在Java中打印沙漏图案是一个经典的编程练习,它不仅能考察循环控制能力,还能帮助理解字符串操作和格式化输出,下面将详细介绍实现方法,包括核心思路、代码实现和优化技巧。

核心思路
沙漏图案由上下对称的三角形组成,中间是一条横线,实现的关键在于:
- 确定行数:沙漏的总行数通常为奇数,例如2n+1行(n为上半部分行数)。
- 上半部分:从1到n行,每行包含空格和星号,空格数量随行数增加而递减,星号数量递增。
- 中间行:单独打印一行星号,长度为2n+1。
- 下半部分:从n到1行,与上半部分对称,空格递增,星号递减。
代码实现
以下是完整的Java代码示例,通过嵌套循环实现沙漏打印:
public class Sandglass {
public static void main(String[] args) {
int n = 5; // 上半部分行数,总行数为2n+1
printSandglass(n);
}
public static void printSandglass(int n) {
// 上半部分
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 1; j < i; j++) {
System.out.print(" ");
}
// 打印星号
for (int k = 1; k <= 2 * (n - i) + 1; k++) {
System.out.print("*");
}
System.out.println();
}
// 中间行
for (int i = 1; i <= 2 * n + 1; i++) {
System.out.print("*");
}
System.out.println();
// 下半部分
for (int i = n; i >= 1; i--) {
// 打印空格
for (int j = 1; j < i; j++) {
System.out.print(" ");
}
// 打印星号
for (int k = 1; k <= 2 * (n - i) + 1; k++) {
System.out.print("*");
}
System.out.println();
}
}
}
代码解析
-
上半部分循环:
- 外层循环控制行数(1到n)。
- 第一个内层循环打印前导空格,数量为
i-1。 - 第二个内层循环打印星号,数量为
2*(n-i)+1,随行数增加而减少。
-
中间行:

- 直接打印
2n+1个星号,形成沙漏的腰线。
- 直接打印
-
下半部分循环:
- 外层循环从n递减到1,与上半部分对称。
- 空格和星号的计算逻辑与上半部分相同,但行序相反。
优化技巧
-
动态输入行数:通过
Scanner类让用户输入行数,提高灵活性:Scanner scanner = new Scanner(System.in); System.out.print("请输入上半部分行数n:"); int n = scanner.nextInt(); printSandglass(n); -
使用StringBuilder:对于大尺寸沙漏,
StringBuilder能提升字符串拼接效率:StringBuilder sb = new StringBuilder(); for (int k = 1; k <= 2 * (n - i) + 1; k++) { sb.append("*"); } System.out.println(sb.toString()); -
封装方法:将打印逻辑封装为独立方法,便于复用和测试。

输出示例
当n=5时,程序输出如下:
通过合理运用循环嵌套和字符串格式化,可以轻松实现Java沙漏打印,关键在于理解空格和星号的数学规律,并根据对称性拆分上下两部分,进一步优化后,代码可扩展性更强,适用于不同尺寸的沙漏输出。



















