Java에서 중첩 루프를 제거하려면 어떻게해야합니까?


1818

다음과 같이 중첩 루프 구조가 있습니다.

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

이제 두 루프에서 어떻게 벗어날 수 있습니까? 비슷한 질문을 보았지만 Java와 관련된 것은 없습니다. 대부분의 gotos를 사용했기 때문에 이러한 솔루션을 적용 할 수 없습니다.

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

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

답변:


2427

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

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

286
이것은 않습니다 루프 직후로 이동합니다. 시도 해봐! 예, 라벨은 루프 앞에옵니다. 왜냐하면 출구를 나가려는 곳이 아니라 루프에 라벨을 붙이기 때문입니다. (라벨도 계속 사용할 수 있습니다.)
— Jon Skeet

2
Perl은 또한 자체 레이블 시스템을 허용합니다. 저는 많은 언어들이 그렇게 생각합니다. Java 언어라는 사실은 놀랍지 않습니다.
— Evan Carroll

9
@Evan-그 주장은 사실입니다. 그러나 Java는 그러한 약속을하지 않습니다. 언어가 가정과 충돌하는 경우 잘못된 가정 일 수 있습니다. 이 경우에, 당신은 여전히 ​​그 형식에 대해 들어 본 적이 없거나 잊어 버린 많은 사람들에게 WRT를 놀라게하는 최소한의 원칙이라고 생각합니다 break. 그럼에도 불구하고 예외는 잘 알려진 또 다른 예외입니다 (죄송합니다). 그러나 명확하지 않은 경우에도 여전히 불만입니다 (작은 루프, 레이블 / 중단이 여전히 보이지 않으면 경고 주석).
— Steve314

6
@MuhammadBabar : outerloop는 레이블입니다. 정확히 어떤 코드를 시도했는지는 모르지만 답변의 코드는 컴파일되고 제대로 실행됩니다.
— Jon Skeet

4
@NisargPatil sonarLint에 있기 때문에 코드 냄새가 나지 않습니다. 그것은 단지 개인적인 가려움증과 함께 sonarLint에 이것을 추가 한 개발자가 있다는 것을 의미하며, 악용 될 때만 의미가있는 이러한 종류의 규칙으로 가득 차 있거나 일부 개발자는 그들에게 개인적인 증오 성전을 가지고 있기 때문입니다. 레이블이있는 나누기 및 계속은 수행하려는 작업을 설명하는 매우 우아한 방법입니다.
— john16384

402

기술적으로 정답은 외부 루프에 레이블을 지정하는 것입니다. 실제로 내부 루프 내부의 어느 지점에서나 종료하려면 코드를 메소드 (필요한 경우 정적 메소드)로 외부화 한 다음 호출하는 것이 좋습니다.

가독성에 대한 보상입니다.

코드는 다음과 같습니다.

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

30
때로는 내부 루프 외부에있는 여러 로컬 변수를 사용하여 모든 변수를 전달하면 어색한 느낌을 줄 수 있습니다.
— Haoest

1
그렇다면이 솔루션은 어떻게 받아 들인 대답과 같이 "완료"를 인쇄합니까?
— JohnDoe

1
@JohnDoe 호출 한 다음 System.out.println ( "done"); search 메소드 내에서 {} finally {} 시도도 옵션입니다.
— Zo72

2
이것은 내가 생각하는 것이 더 나은 방법이지만, 깨지 않고 계속하려면 어떻게해야합니까? 레이블은 똑같이 (또는 나쁘게) 지원하지만이 논리를 계속 변환하는 방법을 모르겠습니다.
— Rob Grant

@RobertGrant 중단 대신 계속하려면 외부 루프를 loop메소드 외부로 이동하고 메소드에서 돌아와 계속하십시오.
— Muhd

215

루프 주위에 명명 된 블록을 사용할 수 있습니다.

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

40
레이블을 사용하기 위해 새 블록을 만들 필요가 없습니다.
— Jon Skeet

81
아니요, 그러나 의도를 훨씬 더 명확하게 만듭니다. 허용 된 답변에 대한 첫 번째 의견을 참조하십시오.
— Bombe

2
실제로는 명명 된 블록이 아니며 레이블 다음에 레이블없이 Java 표현식을 작성할 수 있습니다 name: if(...){...}. :)
— La VloZ Merrill 2016

4
이 구문은 for직접 레이블을 지정하는 것보다 큰 이점이 있습니다. }조건이 충족되지 않은 경우에만 실행될 코드를 마지막에 추가 할 수 있습니다 .
— Florian F

2
명명 된 루프가 아니라 명명 된 블록입니다. 그 루프 내에서 "검색을 계속하십시오"; 루프의 이름이 search 인 경우 이는 완전히 올바른 구문입니다. 당신은 그것을 깰 수는 있지만 계속할 수는 없습니다.
— Tatarize

132

나는 라벨을 사용하지 않습니다. 들어가는 것은 나쁜 습관처럼 보입니다. 내가 할 일은 다음과 같습니다.

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

4
이 && !finished대신 대신 해서는 안 || !finished됩니까? 그러면 왜 break전혀 사용하지 않고 && !finished내부 루프에도 사용하지 않습니까?
— 간달프

4
내가 사용 break임의로 루프를 종료 할 수 있도록. 해당 if블록 뒤에 코드가 있으면 break실행하기 전에 할 수 있습니다 . 하지만 당신은 맞습니다 &&. 고쳤다.
— Elle Mundy

2
좋은 해결책! 그것이 추가 기능에 넣는 것이 어떤 이유로 바람직하지 않은 경우 실제로 실제로 수행하는 방법입니다.
— benroth

6
내부 루프 이후에 어떤 논리가있을 경우 잠재적 인 문제가 있습니다. 새로운 루프가 시작될 때만 계속 실행되고 외부 루프가 중단됩니다.
— Karthik Karuppannan

7
왜 그렇게해야하는지 모르겠습니다. 코드를 다루는 사람들은 언어의 모든 기능을 사용할 수 있어야합니다. 다른 사람들이 이해할 수있는 코드를 작성하는 것이 중요하지만 언어에서 제공하는 공식 도구의 사용을 제한하지 않고 동일한 기능에 대한 해결 방법을 찾는 것이 중요합니다. 아니면 "나쁜 연습"이라는 다른 의미가 있습니까?
— codepleb

107

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

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

4
내게 +1 해주세요. 요점은 간단하다. 동시에 답변했기 때문에 기존 답변을 반복한다고 비난받을 수 없습니다.
— Heimdall

40

기능을 사용하십시오 :

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

20

임시 변수를 사용할 수 있습니다 :

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

7
나는 이런 식으로 혼란 스럽습니다.
— boutta

11
루프를 통해 매번 추가 조건 검사? 고맙지 만 사양 할게.
— ryandenki

15

breaks 및 gotos 가 마음에 들지 않으면 추가 중단 조건과 함께 for-in 대신 "전통적인"for 루프를 사용할 수 있습니다.

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

2
foreach 루프에는 적합하지 않습니다.
— John McClane

1
@JohnMcClane 그리고 당신은 9 세 이상의 질문에 대한 많은 답변에 대해 스팸 메일을 보냅니다. 왜냐하면 ...?
— Quintec

12

비슷한 작업을 수행해야했지만 Enhanced 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;
        }
    }
}

조건이 깨진 후 모든 항목을 반복하는 것이 시원하지 않습니다. 따라서 else 경우에 중단을 추가합니다.
— boutta

@boutta이 결론에 어떻게 도달하고 있는지 잘 모르겠습니다. 조건이 충족되면 두 루프가 모두 종료됩니다.
— Swifty McSwifterton

좋아, 나는 's'var의 조작으로 그 부분을 얻지 못했다. 그러나 s가 크기를 나타 내기 때문에 그런 종류의 나쁜 스타일을 발견했습니다. 그럼 난 명시 적 바르와 ddyer에서 답을 선호 : stackoverflow.com/a/25124317/15108
— boutta

@boutta s보다 작은 값으로 i변경 i하거나보다 크거나 같은 값으로 변경할 수 s있습니다. 둘 다 트릭을 수행해야합니다. s나중에 다른 곳에서 사용할 수 있기 때문에을 변경하는 것이 맞습니다 .하지만 변경해 i도 해를 끼치 지 for않습니다. 첫 번째 루프가 계속 반복되지 않도록하십시오 .
— Zsolti

9

루프 테스트에 명시적인 "종료"를 추가하는 것을 선호합니다. 루프를 조기에 종료 할 수 있다는 것은 모든 일반 독자에게 분명합니다.

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

foreach 루프에는 적합하지 않습니다.
— John McClane

8

자바 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**/);

1
@ Tvde1이며 다른 사용자에게도 유용하므로 새로운 방법과 솔루션을 언제나 환영합니다
— Andrei Suvorkov

와, 그거 못 생겼어
— DS.

7

일반적으로 그러한 경우에는 더 의미있는 논리의 범위에 들어갑니다. 문제가있는 반복되는 '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;
}

주요 단점 :

  • 대략 두 배 더 많은 라인
  • 더 많은 컴퓨팅 사이클 소비, 즉 알고리즘 관점에서 느리다는 의미
  • 더 많은 타이핑 작업

장점 :

  • 기능 세분성으로 인해 우려 분리 비율이 높음
  • 검색 / 조작 로직의 높은 재 사용률 및 제어 비율
  • 방법이 길지 않기 때문에 더 작고 이해하기 쉽습니다.
  • 높은 가독성

따라서 다른 접근 방식을 통해 사례를 처리하고 있습니다.

기본적 으로이 질문의 저자에게 질문 :이 접근법에 대해 어떻게 생각하십니까?


6

label : 및 flags를 사용하지 않고 모든 루프에서 벗어날 수 있습니다.

까다로운 해결책입니다.

여기서 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");
    }
}

2
for-each 루프와 함께 이것을 어떻게 사용합니까? ;)
— Willi Mentzel

5
list.size ()> 5와 같이보다 정교한 루프 조건이 있으면 작동하지 않습니다. 또한 그것은 실제로 해킹입니다. 읽기 어렵고 나쁜 연습입니다!
— Neuron

오류가 발생하기 쉽습니다. 당신이 내부 루프를 변경 상상 (int k = 0; k < 10; k++)그리고 당신은 모든 해결되지 않았습니다 k = 9에 k = 10. 무한 루프에 빠질 수 있습니다.
— Florian F

5

Labeled Break 개념은 Java에서 중첩 루프를 분리하는 데 사용됩니다. Labeled Break 를 사용하면 어느 위치에서나 루프 중첩을 중단 할 수 있습니다. 예 1 :

loop1:
 for(int i= 0; i<6; i++){
    for(int j=0; j<5; j++){
          if(i==3)
            break loop1;
        }
    }

루프가 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;
        }
    }
}

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

4

그것이 어떤 함수 안에 있다면 왜 그것을 반환하지 않습니까?

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
            return value;
         }
    }
}

이 패턴을 선호합니다. 종종 루프를 별도의 함수로 나눕니다. 내 코드는 그렇게 한 후에 항상 더 좋았으므로 이런 이유로 나는이 답변을 정말로 좋아합니다.
— Bill K

4

가장 쉽고 쉬운 방법

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

4
레이블이 없어도 같은 시점에서 끊어지기 때문에 이러한 끊기의 예는 그다지 도움이되지 않습니다. 또한 그것은 innerloop에 도달되지 않을 수 있기 때문에 실제로, 코드의 경우와하지 않은, 실행할 수있는 코드가 항상 좋은 데요 ..
— 신경 세포

나는 같은 것을 입력하려고했습니다. 이 경우 레이블은 다소 쓸모가 없습니다.
— Taslim Oseni

4

오히려 비정상적인 접근법이지만 코드 길이 ( 성능 아님) 측면에서 이것은 가장 쉬운 방법입니다.

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


4

예제없이 언급 된 또 하나의 솔루션 (실제로 prod 코드에서 작동 함).

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

물론 BreakLoopException내부, 개인 및 스택 없음 추적으로 가속화되어야합니다.

private static class BreakLoopException extends Exception {
    @Override
    public StackTraceElement[] getStackTrace() {
        return new StackTraceElement[0];
    }
}

1
실제로 -23 표를 얻는 답변에서 stackoverflow.com/a/886980/2516301 에 언급되었습니다 . 그것은 일을 할 것입니다, 그러나 그것은 매우 나쁜 프로그래밍 연습입니다 ...
— vefthym

과연. 그러나 몇 가지 파괴 조건이있는 레거시 코드-4 레벨 중첩 루프를 보았습니다. 인라인 코드가 아닌 예외로 인해 더 읽기 쉽습니다. -23 표는 대부분 정서적 평가이지만 그렇습니다.이 방법은주의해서 사용해야합니다.
— ursa

1
중앙 리턴을 가진 별도의 함수 호출로 나뉘어져 있다면 훨씬 더 읽기 쉬웠을 것입니다. 작은 리 팩터로 개선 된 경우가 많으므로 독립형 (종종 재사용 할 수있는) 기능으로 의미가 있습니다.
— Bill K

2

for (int j = 0; j < 5; j++) //inner loop로 교체해야합니다 for (int j = 0; j < 5 && !exitloops; j++).

여기서이 경우 condition이 인 경우 완전한 중첩 루프를 종료해야합니다 True. 그러나 우리 exitloops가 상단에만 사용하면 loop

 for (int i = 0; i < 5 && !exitloops; i++) //upper loop

그러면 내부 루프가 종료되도록 알리는 추가 플래그가 없기 때문에 내부 루프가 계속됩니다.

예 : if i = 3와 j=2then 조건은 false입니다. 그러나 내부 루프의 다음 반복에서 j=3 다음 조건이 (i*j)될 수 9있는 true있지만까지 내부 루프가 계속됩니다 j된다 5.

따라서 exitloops내부 루프에도 사용해야 합니다.

boolean exitloops = false;
for (int i = 0; i < 5 && !exitloops; i++) { //here should exitloops as a Conditional Statement to get out from the loops if exitloops become true. 
    for (int j = 0; j < 5 && !exitloops; j++) { //here should also use exitloops as a Conditional Statement. 
        if (i * j > 6) {
            exitloops = true;
            System.out.println("Inner loop still Continues For i * j is => "+i*j);
            break;
        }
        System.out.println(i*j);
    }
}

2

@ 1800 INFORMATION 제안과 같이 내부 루프를 끊는 조건을 외부 루프의 조건으로 사용하십시오.

boolean hasAccess = false;
for (int i = 0; i < x && hasAccess == false; i++){
    for (int j = 0; j < y; j++){
        if (condition == true){
            hasAccess = true;
            break;
        }
    }
}

2

새로운 구현이라면 로직을 if-else_if-else 문으로 다시 작성해 볼 수 있습니다.

while(keep_going) {

    if(keep_going && condition_one_holds) {
        // Code
    }
    if(keep_going && condition_two_holds) {
        // Code
    }
    if(keep_going && condition_three_holds) {
        // Code
    }
    if(keep_going && something_goes_really_bad) {
        keep_going=false;
    }
    if(keep_going && condition_four_holds) {
        // Code
    }
    if(keep_going && condition_five_holds) {
        // Code
    }
}

그렇지 않으면 특수 조건이 발생할 때 플래그를 설정하고 각 루프 조건에서 해당 플래그를 확인할 수 있습니다.

something_bad_has_happened = false;
while(something is true && !something_bad_has_happened){
    // Code, things happen
    while(something else && !something_bad_has_happened){
        // Lots of code, things happens
        if(something happened){
            -> Then control should be returned ->
            something_bad_has_happened=true;
            continue;
        }
    }
    if(something_bad_has_happened) { // The things below will not be executed
        continue;
    }

    // Other things may happen here as well, but they will not be executed
    //  once control is returned from the inner cycle.
}

여기! 따라서 간단한 휴식은 작동하지 않지만을 사용하여 작동하도록 만들 수 있습니다 continue.

단순히 하나의 프로그래밍 언어에서 Java로 로직을 포팅하고 작동하는 것을 원한다면 레이블을 사용해보십시오 .


2

데모에 대한 break, continue그리고 label:

Java 키워드 break및 continue기본값이 있습니다. 그것은 "가장 가까운 루프"이며, 오늘날 몇 년 동안 Java를 사용한 후 방금 찾았습니다!

드물게 사용되지만 유용합니다.

import org.junit.Test;

/**
 * Created by cui on 17-5-4.
 */

public class BranchLabel {
    @Test
    public void test() {
        System.out.println("testBreak");
        testBreak();

        System.out.println("testBreakLabel");
        testBreakLabel();

        System.out.println("testContinue");
        testContinue();
        System.out.println("testContinueLabel");
        testContinueLabel();
    }

    /**
     testBreak
     a=0,b=0
     a=0,b=1
     a=1,b=0
     a=1,b=1
     a=2,b=0
     a=2,b=1
     a=3,b=0
     a=3,b=1
     a=4,b=0
     a=4,b=1
     */
    public void testBreak() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    break;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testContinue
     a=0,b=0
     a=0,b=1
     a=0,b=3
     a=0,b=4
     a=1,b=0
     a=1,b=1
     a=1,b=3
     a=1,b=4
     a=2,b=0
     a=2,b=1
     a=2,b=3
     a=2,b=4
     a=3,b=0
     a=3,b=1
     a=3,b=3
     a=3,b=4
     a=4,b=0
     a=4,b=1
     a=4,b=3
     a=4,b=4
     */
    public void testContinue() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    continue;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testBreakLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     * */
    public void testBreakLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        break anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }

    /**
     testContinueLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     a=1,b=0,c=0
     a=1,b=0,c=1
     a=2,b=0,c=0
     a=2,b=0,c=1
     a=3,b=0,c=0
     a=3,b=0,c=1
     a=4,b=0,c=0
     a=4,b=0,c=1
     */
    public void testContinueLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        continue anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }
}

2

데모

public static void main(String[] args) {
    outer:
    while (true) {
        while (true) {
            break outer;
        }
    }
}

1

다음을 수행 할 수 있습니다.

  1. 지역 변수를 false

  2. true깨고 싶을 때 첫 번째 루프에서 해당 변수 를 설정하십시오.

  3. 그런 다음 외부 루프에서 조건이 설정되어 있는지 여부를 확인한 다음 외부 루프에서도 분리 할 수 ​​있습니다.

    boolean isBreakNeeded = false;
    for (int i = 0; i < some.length; i++) {
        for (int j = 0; j < some.lengthasWell; j++) {
            //want to set variable if (){
            isBreakNeeded = true;
            break;
        }
    
        if (isBreakNeeded) {
            break; //will make you break from the outer loop as well
        }
    }

1

어떤 경우에는 while루프를 효과적으로 사용할 수 있습니다.

Random rand = new Random();
// Just an example
for (int k = 0; k < 10; ++k) {
    int count = 0;
    while (!(rand.nextInt(200) == 100)) {
       count++;
    }

    results[k] = count;
}

1

Java에는 C ++에있는 것처럼 goto 기능이 없습니다. 그러나 여전히 gotoJava에서 예약 된 키워드입니다. 그들은 미래에 그것을 구현할 수 있습니다. 귀하의 질문에 대한 대답은 Java에 레이블이라는 것이 있고 continueand 및 break문을 적용 할 수 있다는 것 입니다. 아래 코드를 찾으십시오.

public static void main(String ...args) {
    outerLoop: for(int i=0;i<10;i++) {
    for(int j=10;j>0;j--) {
        System.out.println(i+" "+j);
        if(i==j) {
            System.out.println("Condition Fulfilled");
            break outerLoop;
        }
    }
    }
    System.out.println("Got out of the outer loop");
}

1

외부 루프에 대한 플래그를 작성하고 내부 루프를 실행할 때마다 답이 될 수 있는지 확인하십시오.

이처럼 :

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

1
boolean condition = false;
for (Type type : types) {
    for (int i = 0; i < otherTypes.size && !condition; i ++) {
        condition = true; // If your condition is satisfied
    }
}

condition처리가 완료되면 플래그로 사용하십시오 . 그런 다음 내부 루프는 조건이 충족되지 않은 동안에 만 계속 작동합니다. 어느 쪽이든, 외부 루프는 계속 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.