输出数字的方法

时间:2018-03-06 19:43:05

标签: java methods

我正在尝试编写一个输出下图的方法:

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

我尝试了所有内容,但我的代码总是输出:

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

这是我的代码:

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();
        }
    }
}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

循环太多;你需要一个从i0(行数#)的外循环y。然后是一个从iy - 1的空间循环,另一个从y - i - 1y的循环。然后一个新线。此外,这里不需要实例;所以我们可以制作方法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();
        }

你实际上只需要做两个循环。

另外,还有一个快速的风格观点:不要与truefalse明确比较。

while (s != true)

可以简化为

while (!s)

更“干净”,更简洁。

编辑:正如评论中指出的那样,您可能还想考虑使用比s更有意义的变量名称 - 这样的名称对于调试来说可能非常混乱(或者如果你或其他人必须稍后修改代码。)