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; } } } } |
应该这样。在