2012-10-25 32 views
35

如果我有一个循环循环,一旦语句满足,我想打破主循环,我该怎么做?如何从双/嵌套循环中的主/外循环中断开?

这是我的代码:

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 second loop not main one. 
       } 
      } 
     } 
    } 
+0

使用标签。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html –

回答

58

使用标记的断裂

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

另请参见

+0

太棒了!我学到了一些新东西。我认为标签过去了几天(记得GW-BASIC?)。我会为此使用布尔标志,但标签要冷得多! – ADTC

+0

@ADTC GW-BASIC从不支持文本标签,只有数字行号(它需要这些标签)。 IIRC从微软出来,它是QuickBASIC,增加了对文本标签的支持,以及命名的子程序。 QBasic当然包括这种支持,如果维基百科要被信任,至少不迟于Visual Basic。 –

12

您可以只从return控制该功能。或者使用丑陋的break labels方法:) 如果在for语句后有另一个代码部分,则可以重构函数中的循环。

国际海事组织使用休息和继续在面向对象中应该是不鼓励的,因为它们会影响可读性和维护。当然,有些情况下他们很方便,但总的来说,我认为我们应该避免它们,因为它们会鼓励使用goto风格编程。

显然这个问题的变化很多,here彼得提供了一些使用标签的好用和奇怪的用途。

+2

来源/捍卫您的标签很难看的说法 –

+5

在这种特殊情况下,退货可能是适当的。然而标签并不难看,而且通常很有用。 –

+2

@JanDvorak非常感谢,难以调试。 – dan

2

只是为了好玩

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] 
+0

语法错误。缺少分号。 –

+0

哈哈:)肯定upvote这个创造性的想法 –

+2

看起来很危险: –

3

看起来像一个Java的带标签的出现要走的路(基于其他答案的共识)。 (?大多数)

但对许多其他语言,或者如果你想避免任何goto像控制流程,需要设置一个标志:

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

如果一个标签打破真的是在Java中走的路,那么在C/C++中走的路就是转向。 –

+0

此外,问题清楚地标记为'java'。 –

+1

不会改变搜索'break嵌套循环'的人可能遇到它的事实。 @EvanHarper我会同意这种推理,但我没有花太多时间在Java中,所以就与其他答案的共识一起去了...... – Thymine

0

最佳和便于初学者甚至

方法
outerloop: 
for(int i=0; i<10; i++){ 
    // here we can break Outer loop by 
    break outerloop; 

innerloop: 
    for(int i=0; i<10; i++){ 
     // here we can break innerloop by 
     break innerloop; 
    } 
}