Vraag Het doorbreken van geneste lussen in Java


Ik heb een geneste lusconstructie zoals deze:

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

Hoe kan ik nu uit beide loops komen. Ik heb naar soortgelijke vragen gekeken, maar geen daarvan heeft specifiek betrekking op Java. Ik kon deze oplossingen niet toepassen, omdat de meeste gebruikte gotos.

Ik wil de innerlijke lus niet op een andere manier plaatsen.

Update: ik wil de loops niet herhalen, bij het breken ben ik klaar met het uitvoeren van het loopblok.


1539
2018-05-20 09:07


oorsprong


antwoorden:


Net als andere antwoordapparaten zou ik dat zeker doen verkiezen om de binnenste lus op een andere manier te zetten. Dit antwoord laat alleen zien hoe aan de vereisten in de vraag kan worden voldaan.

Je kunt gebruiken break met een label voor de buitenste lus. Bijvoorbeeld:

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

Dit drukt:

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

2080
2018-05-20 09:11



Technisch gezien is het juiste antwoord om de buitenste lus te labelen. Als je in de praktijk op een willekeurig punt binnen een innerlijke lus wilt afsluiten, zou je de code beter kunnen externaliseren naar een methode (een statische methode indien nodig) en het dan noemen.

Dat zou zijn vruchten afwerpen voor de leesbaarheid.

De code zou zoiets worden:

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

Overeenkomen met het voorbeeld voor het geaccepteerde antwoord:

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

368
2017-11-14 18:26



U kunt een benoemd blok rond de lussen gebruiken:

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

186
2018-05-20 09:12



Ik gebruik nooit labels. Het lijkt een slechte gewoonte om erin te komen. Dit is wat ik zou doen:

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

112
2017-12-07 17:52



U kunt labels gebruiken:

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

79
2018-05-20 09:11



misschien met een functie?

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

32
2018-05-20 11:43



U kunt een tijdelijke variabele gebruiken:

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

Afhankelijk van je functie, kun je ook afsluiten / terugkeren vanuit de binnenste lus:

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

15
2018-05-20 09:11