java - 在Java里, 如何跳出嵌套循环

  显示原文与译文双语对照的内容

我有一个类似这样的嵌套循环构造:


for (Type type : types) {
 for (Type t : types2) {
 if (some condition) {
//Do something and break...
 break;//Breaks out of the inner loop
 }
 }
}

现在我如何打破两个循环。 我查看了类似的问题,但没有涉及到 Java 。 我无法应用这些解决方案,因为大多数使用的gotos 。

我不想将内部循环放入不同的方法中。

更新:我不想重新运行循环,当中断了循环块的执行。

时间:

(编辑:像其他answerers一样,我肯定会喜欢把内循环以不同的方法。 这个答案只是展示了如何满足问题中的需求。

可以将 break 与外部循环的标签一起使用。 例如:


public class Test {
 public static void main(String[] args) {
 outerloop:
 for (int i=0; i <5; i++) {
 for (int j=0; j <5; j++) {
 if (i * j> 6) {
 System.out.println("Breaking");
 break outerloop;
 }
 System.out.println(i +"" + j);
 }
 }
 System.out.println("Done");
 }
}

这个指纹:


0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done

技术上正确的答案是标签外循环。 实际上,如果你想在一个内部循环的任何地方退出,你最好把代码外部化,然后调用它。

,偿还可读性。

代码将变成如下所示:


private static String search(...) 
{
 for (Type type : types) {
 for (Type t : types2) {
 if (some condition) {
//Do something and break...
 return search;
 }
 }
 }
 return null; 
}

匹配接受的答案的示例:


 public class Test {
 public static void main(String[] args) {
 loop();
 System.out.println("Done");
 }

 public static void loop() {
 for (int i = 0; i <5; i++) {
 for (int j = 0; j <5; j++) {
 if (i * j> 6) {
 System.out.println("Breaking");
 return;
 }
 System.out.println(i +"" + j);
 }
 }
 }
}

可以在循环中使用命名块:


search: {
 for (Type type : types) {
 for (Type t : types2) {
 if (some condition) {
//Do something and break...
 break search;
 }
 }
 }
}

我从不使用标签。这似乎是一个坏习惯。 下面是我要做的:


boolean finished = false;
for (int i = 0; i <5 &&!finished; i++) {
 for (int j = 0; j <5; j++) {
 if (i * j> 6) {
 finished = true;
 break;
 }
 }
}

也许有一个函数?


public void doSomething(List<Type> types, List<Type> types2){
 for(Type t1 : types){
 for (Type t : types2) {
 if (some condition) {
//do something and return...
 return;
 }
 }
 }
}

你可以使用临时变量:


boolean outerBreak = false;
for (Type type : types) {
 if(outerBreak) break;
 for (Type t : types2) {
 if (some condition) {
//Do something and break...
 outerBreak = true;
 break;//Breaks out of the inner loop
 }
 }
}

根据你的函数,你还可以从内部循环退出/返回:


for (Type type : types) {
 for (Type t : types2) {
 if (some condition) {
//Do something and break...
 return;
 }
 }
}

我需要做类似的事情,但是我选择了不使用增强的循环来做。


int s = type.size();
for (int i = 0; i <s; i++) {
 for (int j = 0; j <t.size(); j++) {
 if (condition) {
//do stuff after which you want 
//to completely break out of both loops
 s = 0;//enables the main loop to terminate
 break;
 }
 }
}

如果不喜欢 breakgoto,可以使用"繁体中文"来代替 for-in,使用额外的中止条件:


int a, b;
bool abort = false;
for (a = 0; a <10 &&!abort; a++) {
 for (b = 0; b <10 &&!abort; b++) {
 if (condition) {
 doSomeThing();
 abort = true;
 }
 }
}

我更喜欢在循环测试中添加一个显式的"退出"。 它使任何休闲读者明白循环可能提前终止。


boolean earlyExit = false;
for(int i=0;i<10&&!earlyExit; i++) {
 for(int j=0;i<10&&!earlyExit; j++) { earlyExit=true; }
}

...