[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를 사용했기 때문에 이러한 솔루션을 적용 할 수 없습니다.

내부 루프를 다른 방법으로 넣고 싶지 않습니다.

루프를 다시 실행하고 싶지 않습니다. 깨면 루프 블록 실행이 끝났습니다.



답변

다른 응답자와 마찬가지로 루프를 다른 방법으로 넣는 것을 선호 합니다.이 시점에서 완전히 반복을 중지하기 위해 돌아갈 수 있습니다. 이 답변은 질문의 요구 사항을 어떻게 충족시킬 수 있는지 보여줍니다.

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;
        }
    }
}


답변

라벨을 사용할 수 있습니다 :

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}


답변

기능을 사용하십시오 :

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;
         }
    }
}