2

可能重复:
打破 Java 中的嵌套循环

例如,如伪代码所示,我如何使用 break 和/或 continue 语句在点 1、2 和 3 处返回 while 循环的第一行?

假设我有一个让人联想到以下内容的场景:

while(condition) {
    // want to return to this point
    for (Integer x : xs) {
        // point 1
        for (Integer y : ys) {
            // point 2
            ...
        }
        ...
    }
    for (Integer a : as) {
        for (Integer b : bs) {
            // point 3
            ...
        }
        ...
    }
}
4

6 回答 6

5

使用标签,例如:

outer:
while(condition) {
// want to return to this point
for (Integer x : xs) {
    // point 1
    for (Integer y : ys) {
        // point 2
        ...
    }
    ...
}
for (Integer a : as) {
    for (Integer b : bs) {
        // point 3
        ...
    }
    ...
}

}

然后您可以使用它break outer;来转义 while 循环。这也适用于嵌套的 for 循环,但我尽量不要过度使用标签

正如@Peter 所指出的,continue outer;如果您希望尽早完成当前的外部迭代并继续下一个迭代,而不是转义 while 循环,请使用。

于 2012-12-12T16:39:58.403 回答
2

用语法标记你的循环

LABEL: LoopType稍后您可以使用Break 语句退出某个循环break LABEL;

OUT: while(somecond){
IN:for(...) {
   INNER: for(...){
break IN;// will get you outta IN and INNER for loop
}
 }
}
于 2012-12-12T16:41:04.783 回答
2
loop:
while(condition) {
// want to return to this point
for (Integer x : xs) {
    continue loop:
    for (Integer y : ys) {
        continue loop:
        ...
    }
    ...
}
for (Integer a : as) {
    for (Integer b : bs) {
        continue loop:
        ...
    }
    ...
}

}

于 2012-12-12T16:41:41.123 回答
1

你可以这样做:

here:
while(condition) {
   for (Integer x : xs) {
        // point 1
        for (Integer y : ys) {
            break here;
        }
    }

Java 规范中描述了带或不带标签的 break 语句:

没有标签的 break 语句试图将控制转移到最里面的封闭式 switch、while、do 或 for 立即封闭方法或初始化程序的语句;此语句称为中断目标,然后立即正常完成。

带有标签 Identifier 的 break 语句尝试将控制转移到封闭的带有标签的语句(第 14.7 节),该语句具有与其标签相同的 Identifier;此语句称为中断目标,然后立即正常完成。在这种情况下,break 目标不必是 switch、while、do 或 for 语句。

于 2012-12-12T16:40:16.517 回答
0

是的,您可以使用break带有标签的语句:

SOME_LABEL:
   // ... some code here
   break SOME_LABEL;

谨慎使用,这是打破多个嵌套循环的干净方法。

于 2012-12-12T16:39:57.343 回答
0

您可以像在此处发布的那样做 stackoverflow.com/questions/886955/break-out-of-nested-loops-in-java 处理相同的问题。

于 2012-12-12T16:42:30.333 回答