4

我很好奇如何编写这样的代码:

##
##
####
####
####
####
######
######
######
######
######
######
########
########
########
########
########
########
########
########

这是我尝试过的:

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i <= 8; i += 2) {
            for (int j = 0; j < i; j++) {
                System.out.print('#');
            }
            System.out.println();
        }
    }
}

此代码显示:

##
####
######
########

但它打印行的次数不如那里有多少个字符。

所以基本上,它增加 2,然后它显示的行数与循环内的字符数相同。我想不通。

第三个嵌套的 for 循环会是什么样子?

4

5 回答 5

7

这可以通过一个循环来完成,使用String::repeat/Collections.nCopies创建包含 N 个#字符的行,然后创建 N 行:

1.String::repeat 2018 年 9 月 JDK 11 发布后可用的
实例方法String::repeat

for (int i = 2; i <= 8; i += 2) {
    String row = "#".repeat(i) + "\n";
    String rows = row.repeat(i);
    System.out.print(rows);
}

2. String::join+Collections.nCopies

import static java.lang.String.join;
import static java.util.Collections.nCopies;

//...

for (int i = 2; i <= 8; i += 2) {
    String row = join("", nCopies(i, "#"));
    String rows = join("\n", nCopies(i, row));
    System.out.println(rows);
}
于 2020-10-08T06:55:46.257 回答
5

我会在你的两个循环之间使用另一个循环。

for (int i = 0; i <= 8; i += 2) {
    for (int k = 0; k < i; ++k) {
        for (int j = 0; j < i; j++) {
            System.out.print('#');
        }
        System.out.println();
    }
}

它打印:

##
##
####
####
####
####
######
######
######
######
######
######
########
########
########
########
########
########
########
########
于 2020-10-08T06:44:32.620 回答
4

您可以在第一个循环中使用两个非嵌套循环。看这个例子:

public static void main(String[] args) {
    
    for (int i = 0; i <= 8; i += 2) {
        // use a StringBuilder to build up the line to be printed
        StringBuilder lineBuilder = new StringBuilder();
        // then use one loop to build the line with the desired amount of #
        for (int j = 0; j < i; j++) {
            lineBuilder.append('#');
        }
        // and then use an identical loop, but this time print the line
        for (int j = 0; j < i; j++) {
            System.out.println(lineBuilder.toString());
        }
    }
}

结果是所需的结果(此处为简洁起见省略)。

于 2020-10-08T06:50:14.390 回答
0

我们添加另一个循环:

public static void main(String[] args) {
    for (int i = 0; i <= 8; i += 2)
        for (int j = 0; j < i; j++) {
            for (int k = 0; k < i; k++) {
                System.out.print('#');
            }
            System.out.println();
        }
}
于 2020-10-08T06:49:55.160 回答
0

带有单个 for 循环的单分号解决方案,使用String#replace方法自:1.5

for (int i = 1; i < 5; i++)
    // print one line containing
    // newline symbols '\n'
    System.out.print(Collections
            // 'i * 2' copies of rows "##\n"
            // returns List<String>
            .nCopies(i * 2, Collections
                    // 'i * 2' copies of string "#"
                    // returns List<String>
                    .nCopies(i * 2, "#")
                    // List<String> to string
                    // [#, #]
                    .toString()
                    // #, #]
                    .replace("[", "")
                    // #, #
                    .replace("]", "")
                    // ##\n
                    .replace(", ", "") + "\n")
            // List<String> to string
            // [##\n, ##\n]
            .toString()
            // ##\n, ##\n]
            .replace("[", "")
            // ##\n, ##\n
            .replace("]", "")
            // ##\n##\n
            .replace(", ", ""));

使用以下方法的双嵌套 for 循环的解决方案:1.8String#join

for (int i = 1; i < 5; i++) {
    for (int j = 0; j < i * 2; j++) {
        String[] arr = new String[i * 2];
        Arrays.fill(arr, "#");
        System.out.print(String.join("", arr));
        System.out.println();
    }
}

使用双嵌套IntStreamusingString#repeat方法的解决方案,因为:Java 11

IntStream.range(1, 5)
        .forEach(i -> IntStream.range(0, i * 2)
                .forEach(j -> System.out.println("#".repeat(i * 2))));

输出:

##
##
####
####
####
####
######
######
######
######
######
######
########
########
########
########
########
########
########
########
于 2021-02-07T23:52:22.147 回答