有条理地打破Java中的循环

Conditionally breaking for loops in Java

本问题已经有最佳答案,请猛点这里访问。

我想看看多维数组是否是矩形的。我对编程还不熟悉,无法确切地理解为什么"break";不会把我踢出循环,它会继续运行。即使阵列不是矩形的,我仍然能回到原来的状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {

    int a2d[][] = {{1, 2, 3, 4, 5}, {2, 3, 4}, {1, 2, 3, 4, 5}};

    int test = a2d[0].length;

    for (int i = 0; i < a2d.length; i++) {
        for (int j = 0; j < a2d[i].length; j++) {
            if (a2d[i].length == test) {
                System.out.println("True");
            } else {
                System.out.println("False");
                break;
            }
        }
    }
}


为了避免使用标签,请将代码放入返回布尔值的方法中:

1
2
3
4
5
6
7
8
9
10
11
boolean isRectangular(int[][] a2d) {
    int test = a2d[0].length;
    for (int i=0; i<a2d.length; i++){
        for (int j=0; j<a2d[i].length; j++){
            if (a2d[i].length != test) {
                return false;
            }
        }
    }
    return true;
}

代码可以改进以支持参数检查和其他功能,但重点是一旦确定了答案,就从方法返回。


这个问题的Java 8方法将是:

1
2
3
4
5
int a2d[][] = {{1, 2, 3, 4, 5}, {2, 3, 4}, {1, 2, 3, 4, 5}};
boolean isRectangular =
    Arrays.stream(a2d) // First, create a stream
            .map(row -> row.length) // Map the length of each row to process further
            .allMatch(len -> len == a2d[0].length); // Verify the length of all rows

如果使用,则不需要外部循环,这意味着没有中断。此外,如果需要的话,这个循环可以是并行的(以加快速度)。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {

        int a2d[][] = {{1,2,3,4,5},
                       {2,3,4},
                       {1,2,3,4,5}};

        int test = a2d[0].length;
        outer:
        for (int i=0; i<a2d.length; i++){

            for (int j=0; j<a2d[i].length; j++){

                if (a2d[i].length == test) {
                    System.out.println("True");
                } else {
                    System.out.println("False");
                    break outer;
                }
            }
        }
    }

应该这样。在labeled for loops上搜索。这对你也有帮助。