在Java中有条件地打破循环

3
我试图判断多维数组是否为矩形。我是新手,无法确定为什么 "break;" 指令不会让我退出循环,程序仍然在运行。即使数组不是矩形的,我仍然得到 true 的返回值。
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;
            }
        }
    }
}

4
您有嵌套循环。break语句只能终止最接近它的循环。 - Barmar
除非您正在使用标签(例如 outer: for (...))。不过那并不适合新手。 - Gábor Bakos
阅读此链接:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html - agbinfo
3个回答

3
为了避免标签,将代码放入返回布尔值的方法中:
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;
}

代码可以改进以支持参数检查等操作,但关键是你在确定答案后立即从方法中返回。

2

一个Java 8的解决方案可能会如下:

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
因为那样更清晰 ;) - Joeblade
一旦你熟悉了Streams和Lambdas,这就非常简单了。我已经在代码中添加了一些注释。首先,你需要创建一个流(Arrays.stream)。该流包含一系列的int[]对象,你需要将它们map成长度。最后,匹配所有的长度,即检查所有的长度是否相同。 - wassgren
我在期待新的开发人员加入并将这样的代码放入我的项目中,然后一年后有人必须再添加另一个操作。 - Joeblade
听听@Joeblade的意见;) 但更严肃的是,带有if语句和多维数组的嵌套for循环是非常好用的;) - wassgren
@wassgren 哈哈,是的,那是真的。我只是有点夸张,公平地说,我有点像卢德(luddite),我必须习惯新的做事方式。我只是担心初学者(因为Java8可能会在他们大学的函数式编程单元之后教授)会在每个转折点使用它。而且这种编码方式也有缺点。异常处理是一个主要问题。但对于不需要重构/异常的情况,这可以减少样板编码。 - Joeblade
显示剩余2条评论

0
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;
                }
            }
        }
    }

这样就可以了。在Google上搜索带标签的循环这里也会对你有所帮助。


我想我从来没有真正考虑过只是跳出内部循环...现在我明白为什么它不是false了。谢谢大家。 - ZWis212

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接