【问题标题】:Conditionally breaking for loops in Java [duplicate]有条件地打破Java中的循环[重复]
【发布时间】:2015-02-20 20:04:08
【问题描述】:

我正在尝试查看多维数组是否为矩形。我是编程新手,无法完全弄清楚“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;
            }
        }
    }
}

【问题讨论】:

标签: java loops break


【解决方案1】:

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

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
    

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

    【讨论】:

    • 因为这样更清楚;)
    • @Joeblade,我同意。非常清晰(至少如果您习惯于 Java 8 语法)。但是,主要的好处是你不需要自己循环。
    • 哈哈 ^^^ 老实说,我不知道它是如何工作的,但我希望迟早会明白这一点。我猜这都是 Arrays 类的一部分。
    • 好吧,一旦你习惯了 Streams 和 Lambdas,它就非常简单了。我用一些 cmets 更新了代码。首先,您创建一个流 (Arrays.stream)。该流包含一系列int[] 对象,您map 包含长度。最后,匹配所有长度,即检查所有长度是否相同。
    • 我在期待新的开发人员进来并将这样的代码放入我的项目中,然后一年后必须有人向它添加另一个操作。
    【解决方案3】:
    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 loopsThis 也应该对您有所帮助。

    【讨论】:

    • 我想我从来没有真正想过只打破内部循环......现在它完全可以理解为什么它不是错误的。谢谢大家。
    猜你喜欢
    • 2017-06-04
    • 2012-11-30
    • 2020-04-21
    • 1970-01-01
    • 2011-12-08
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多