我有一个这样的嵌套循环结构:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我怎样才能摆脱两个循环?我看过类似的问题,但没有一个特别关注Java.我无法应用这些解决方案,因为大多数使用了gotos.
我不想把内循环放在不同的方法中.
我不想重新运行循环.当我完成循环块的执行时.
Jon*_*eet 2333
像其他的回答者一样,我肯定更喜欢将循环放在一个不同的方法中,此时你可以返回完全停止迭代.这个答案只是说明了如何满足问题中的要求.
您可以使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
这打印:
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
Run Code Online (Sandbox Code Playgroud)
Zo7*_*o72 393
从技术上讲,正确的答案是标记外环.实际上,如果你想在内循环中的任何一点退出,那么你最好将代码外部化为一个方法(如果需要的话,静态方法),然后调用它.
这样可以获得可读性.
代码会变成这样:
private static String search(...)
{
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
return search;
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
匹配接受答案的示例:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*oey 211
您可以在循环周围使用命名块:
search: {
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break search;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ell*_*ndy 128
我从不使用标签.进入这似乎是一种不好的做法.这就是我要做的事情:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
sim*_*622 102
你可以使用标签:
label1:
for (int i = 0;;) {
for (int g = 0;;) {
break label1;
}
}
Run Code Online (Sandbox Code Playgroud)
For*_*ega 38
使用功能:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Rus*_*JaI 22
当您需要退出多个循环时,单独使用“break”关键字并不是合适的方法。无论您的语句被多少个循环包围,您都可以退出立即循环。您可以将“break”与标签一起使用!这里我使用了标签“abc”您可以在 Java 的任何函数中编写如下代码
这段代码展示了如何从最外层循环退出
abc:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if (k == 1){
break abc;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用break语句退出嵌套循环中的任何循环。
for (int i = 0; i < 10; i++) {
abc:for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if (k == 1){
break abc;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码显示了从最内层循环退出的示例。在其他作品中,执行以下代码后,您位于“k”变量循环的外部,但仍在“j”和“i”变量循环内部。
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if (k == 1){
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mig*_*ing 18
您可以使用临时变量:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据您的功能,您也可以从内循环退出/返回:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
zor*_*ord 13
如果您不喜欢break
s和goto
s,则可以使用"传统"for循环而不是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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Swi*_*ton 11
我需要做类似的事情,但我选择不使用增强的for循环来做到这一点.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢在循环测试中添加一个明确的"退出".任何随意的读者都清楚地知道循环可以提前终止.
boolean earlyExit = false;
for(int i = 0 ; i < 10 && !earlyExit; i++) {
for(int j = 0 ; i < 10 && !earlyExit; j++) { earlyExit = true; }
}
Run Code Online (Sandbox Code Playgroud)
标记中断概念用于在 Java 中中断嵌套循环,通过使用标记中断,您可以在任何位置中断循环嵌套。示例 1:
loop1:
for(int i= 0; i<6; i++){
for(int j=0; j<5; j++){
if(i==3)
break loop1;
}
}
Run Code Online (Sandbox Code Playgroud)
假设有 3 个循环并且您想终止循环 3:示例 2:
loop3:
for(int i= 0; i<6; i++){
loop2:
for(int k= 0; k<6; k++){
loop1:
for(int j=0; j<5; j++){
if(i==3)
break loop3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Java 8 Stream
解决方案:
List<Type> types1 = ...
List<Type> types2 = ...
types1.stream()
.flatMap(type1 -> types2.stream().map(type2 -> new Type[]{type1, type2}))
.filter(types -> /**some condition**/)
.findFirst()
.ifPresent(types -> /**do something**/);
Run Code Online (Sandbox Code Playgroud)
使用标签。
INNER:for(int j = 0; j < numbers.length; j++) {
System.out.println("Even number: " + i + ", break from INNER label");
break INNER;
}
Run Code Online (Sandbox Code Playgroud)
参考这篇文章
您可以在不使用任何标签的情况下从所有循环中断:和标志.
这只是一个棘手的解决方案.
这里condition1是用于从循环K和J中断的条件.而condition2是用于从循环K,J和I中断的条件.
例如:
public class BreakTesting {
public static void main(String[] args) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
if (condition1) {
System.out.println("Breaking from Loop K and J");
k = 9;
j = 9;
}
if (condition2) {
System.out.println("Breaking from Loop K, J and I");
k = 9;
j = 9;
i = 9;
}
}
}
}
System.out.println("End of I , J , K");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
最好和最简单的方法..
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;
}
}
Run Code Online (Sandbox Code Playgroud)
通常在这种情况下,它会进入更有意义的逻辑范围,让我们说一些搜索或操纵一些迭代的"for"对象,所以我通常使用函数方法:
public Object searching(Object[] types) { // Or manipulating
List<Object> typesReferences = new ArrayList<Object>();
List<Object> typesReferences2 = new ArrayList<Object>();
for (Object type : typesReferences) {
Object o = getByCriterion(typesReferences2, type);
if(o != null) return o;
}
return null;
}
private Object getByCriterion(List<Object> typesReferences2, Object criterion) {
for (Object typeReference : typesReferences2) {
if(typeReference.equals(criterion)) {
// here comes other complex or specific logic || typeReference.equals(new Object())
return typeReference;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
主要缺点:
专业人士:
所以它只是通过不同的方法处理案例.
对这个问题的作者来说基本上是一个问题:你对这种方法有什么看法?
演示
public static void main(String[] args) {
outer:
while (true) {
while (true) {
break outer;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它相当容易使用label
,您可以使用标签将外部循环与内部循环分开,请考虑下面的示例,
public class Breaking{
public static void main(String[] args) {
outerscope:
for (int i=0; i < 5; i++) {
for (int j=0; j < 5; j++) {
if (condition) {
break outerscope;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用中断变量/标志来跟踪所需的中断。考虑下面的例子。
public class Breaking{
public static void main(String[] args) {
boolean isBreaking = false;
for (int i=0; i < 5; i++) {
for (int j=0; j < 5; j++) {
if (condition) {
isBreaking = true;
break;
}
}
if(isBreaking){
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢使用第一种方法。
boolean broken = false; // declared outside of the loop for efficiency
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
broken = true;
break;
}
}
if (broken) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案,在没有示例的情况下提到(它实际上适用于产品代码)。
try {
for (Type type : types) {
for (Type t : types2) {
if (some condition #1) {
// Do something and break the loop.
throw new BreakLoopException();
}
}
}
}
catch (BreakLoopException e) {
// Do something on look breaking.
}
Run Code Online (Sandbox Code Playgroud)
当然BreakLoopException
应该是内部的、私有的,并且使用 no-stack-trace 加速:
private static class BreakLoopException extends Exception {
@Override
public StackTraceElement[] getStackTrace() {
return new StackTraceElement[0];
}
}
Run Code Online (Sandbox Code Playgroud)
相当不寻常的方法,但就代码长度(不是性能)而言,这是您可以做的最简单的事情:
for(int i = 0; i++; i < j) {
if(wanna exit) {
i = i + j; // if more nested, also add the
// maximum value for the other loops
}
}
Run Code Online (Sandbox Code Playgroud)
如果它在某个函数内,为什么不直接返回它:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
return value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1091462 次 |
最近记录: |