【问题标题】:How do I break from the main/outer loop in a double/nested loop? [duplicate]如何在双/嵌套循环中脱离主/外循环? [复制]
【发布时间】:2012-10-15 21:57:18
【问题描述】:

如果我在一个循环中有一个循环,并且一旦满足 if 语句我想打破主循环,我应该怎么做?

这是我的代码:

for (int d = 0; d < amountOfNeighbors; d++) {
    for (int c = 0; c < myArray.size(); c++) {
        if (graph.isEdge(listOfNeighbors.get(d), c)) {
            if (keyFromValue(c).equals(goalWord)) { // Once this is true I want to break main loop.
                System.out.println("We got to GOAL! It is "+ keyFromValue(c));
                break; // This breaks the second loop, not the main one.
            }
        }
    }
}

【问题讨论】:

标签: java loops syntax for-loop break


【解决方案1】:

使用带标签的中断:

mainloop:
for(){
 for(){
   if (some condition){
     break mainloop;
   }
  }
}

另见

【讨论】:

  • 太棒了!我学到了一些新东西。我以为标签已经过去了几天(还记得 GW-BASIC 吗?)。我会为此使用布尔标志,但标签更酷!
  • @ADTC GW-BASIC 从不支持文本标签,只支持数字行号​​(它需要这些)。 IIRC,来自 Microsoft,它是 QuickBASIC,它增加了对文本标签的支持,以及命名的子例程。如果要信任 Wikipedia,QBasic 肯定包含这样的支持,至少不晚于 Visual Basic。
【解决方案2】:

您可以在循环中添加标签,并使用 labelled break 来跳出相应的循环:-

outer: for (...) {
    inner: for(...) {
        if (someCondition) {
            break outer;
        }
    }
}

查看这些链接了解更多信息:

【讨论】:

    【解决方案3】:

    您可以通过该功能return 控制。或者使用丑陋的break labels 方法:)

    如果在您的for 语句之后还有其他代码部分,您可以重构函数中的循环。

    IMO,不鼓励在 OOP 中使用中断和继续,因为它们会影响可读性和维护。当然,在某些情况下它们很方便,但总的来说我认为我们应该避免它们,因为它们会鼓励使用 goto 样式编程。

    显然,这个问题的变体已经发布了很多。 HerePeter 使用标签提供了一些好的和奇怪的用途。

    【讨论】:

    • 来源/捍卫您对标签丑陋的说法
    • 在这种特殊情况下,return 可能是合适的。但是标签并不难看,而且通常很有用。
    • @JanDvorak 谢谢,丑陋且难以调试。
    • (我通常发现某些语言由于其他原因难以阅读 - 我什至不记得上次我使用显式“双循环”需要打破具有适当 HoF 支持的语言和一个支持集合 API。这将在“任何”函数 IMOHO 方面更清晰地编写;-)
    • IMO,最好重新考虑如何再次编写代码以避免标记循环。这么多人不知道他们存在的原因是因为我们不需要他们。我并不是说它们总是坏的。
    【解决方案4】:

    看起来对于 Java 来说,标记中断似乎是要走的路(基于其他答案的共识)。

    但是对于许多(大多数?)其他语言,或者如果您想避免任何 goto 之类的控制流,您需要设置一个标志:

    bool breakMainLoop = false;
    for(){
        for(){
            if (some condition){
                breakMainLoop = true;
                break;
            }
        }
        if (breakMainLoop) break;
    }
    

    【讨论】:

    • 如果标记的 break 确实是 Java 的方式,那么 C/C++ 的方式就是 goto。
    • 另外,这个问题被明确标记为java
    • 不会改变搜索“中断嵌套循环”的人可能会遇到它的事实。 @EvanHarper 我同意这种推理方式,但我没有在 Java 上花费太多时间,所以只是同意其他答案的共识......
    【解决方案5】:

    只是为了好玩:

    for(int d = 0; d < amountOfNeighbors; d++){
        for(int c = 0; c < myArray.size(); c++){
            ...
                d = amountOfNeighbors;
                break;
            ...
        }
        // No code here
    }
    

    break label 上评论:这是一个向前跳转。它可以中断任何语句并跳转到下一条:

    foo: // Label the next statement (the block)
    {
        code ...
        break foo;  // goto [1]
        code ...
    }
    
    //[1]
    

    【讨论】:

    • 语法错误。缺少分号。
    • 哈哈 :) 肯定会支持这种创造性思维
    • 我希望没有人在生产中使用它:-)
    【解决方案6】:

    对于初学者来说最好的和最简单的方法:

    outerloop:
    
    for(int i=0; i<10; i++){
    
        // Here we can break the outer loop by:
        break outerloop;
    
        innerloop:
    
        for(int i=0; i<10; i++){
    
            // Here we can break innerloop by:
            break innerloop;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2020-08-04
      • 2018-07-15
      • 2013-06-19
      相关资源
      最近更新 更多