我正在尝试编写一个输出下图的方法:
*
**
***
****
*****
我尝试了所有内容,但我的代码总是输出:
*****
****
***
**
*
这是我的代码:
public void outputFigure(int y) {
count1 = y;
count2 = y;
int spaces = 0;
int x = y;
int x2 = y;
boolean s = false;
while (s != true) {
for (int i = spaces; i > 0; i--) {
System.out.print(" ");
}
spaces++;
if (spaces == y - 1) {
s = true;
}
for (count2 = 0; count2 < x; count2++) {
for (count1 = 0; count1 < x2; count1++) {
System.out.print("*");
}
x2--;
System.out.println();
}
}
}
任何帮助将不胜感激。
答案 0 :(得分:2)
循环太多;你需要一个从i
到0
(行数#)的外循环y
。然后是一个从i
到y - 1
的空间循环,另一个从y - i - 1
到y
的循环。然后一个新线。此外,这里不需要实例;所以我们可以制作方法static
。像,
public static void outputFigure(int y) {
for (int i = 0; i < y; i++) {
for (int j = i; j < y - 1; j++) {
System.out.print(" ");
}
for (int j = (y - i - 1); j < y; j++) {
System.out.print("*");
}
System.out.println();
}
}
这里有重复的代码,这违反了DRY(不要重复自己)的原则;让我们重构 - 首先是重复String
任意count
的方法,有很多方法可以做到这一点。一个(使用Java 8+)将是
private static String repeat(String str, int count) {
return Stream.generate(() -> str).limit(count).collect(Collectors.joining());
}
然后我们可以使用它来生成图形。像,
public static void outputFigure(int y) {
IntStream.range(0, y).forEachOrdered(i -> System.out.printf(
"%s%s%n", repeat(" ", y - i - 1), repeat("*", i + 1)));
}
答案 1 :(得分:1)
除了@Elliott Frisch所指出的,还有另一个版本:
for (int i = 1; i <= 5; i++)
{
for (int j = 5; j >= 1; j--)
{
if (j <= i)
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println();
}
你实际上只需要做两个循环。
另外,还有一个快速的风格观点:不要与true
和false
明确比较。
while (s != true)
可以简化为
while (!s)
更“干净”,更简洁。
编辑:正如评论中指出的那样,您可能还想考虑使用比s
更有意义的变量名称 - 这样的名称对于调试来说可能非常混乱(或者如果你或其他人必须稍后修改代码。)