Come uscire dai loop nidificati in Java?


1819

Ho un costrutto di loop nidificato come questo:

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

Ora come posso uscire da entrambi i loop? Ho esaminato domande simili, ma nessuna riguarda Java in particolare. Non ho potuto applicare queste soluzioni perché le goto più utilizzate.

Non voglio mettere il ciclo interno in un metodo diverso.

Non voglio rieseguire i loop. Quando si rompe ho finito con l'esecuzione del loop loop.

Risposte:


2427

Come altri answerers, mi piacerebbe sicuramente preferisco mettere i loop in un metodo diverso, a quel punto si può solo tornare a fermare l'iterazione completamente. Questa risposta mostra solo come possono essere soddisfatti i requisiti della domanda.

È possibile utilizzare breakcon un'etichetta per il ciclo esterno. Per esempio:

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

Questo stampa:

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

287
Questo fa saltare al direttamente dopo il ciclo. Provalo! Sì, l'etichetta viene prima del ciclo, ma è perché sta etichettando il ciclo, piuttosto che il luogo in cui vuoi uscire. (Puoi continuare anche con un'etichetta.)
Jon Skeet,

2
Perl lo consente anche con un proprio sistema di etichette. Penso che molte lingue lo facciano - non mi sorprende quasi che sia in Java.
Evan Carroll,

9
@Evan - questa affermazione è chiaramente vera - nelle lingue che promettono che è vera. Ma Java non fa questa promessa. Se una lingua è in conflitto con le tue assunzioni, è possibile che siano le tue assunzioni a essere colpevoli. In questo caso, penso che tu abbia ancora in parte ragione - il principio della minima sorpresa WRT per i molti che non hanno mai sentito parlare (o dimenticato) quella forma break. Anche allora, le eccezioni sono un'altra eccezione più nota (scusate). Ma non sarei scontento di questo se non fosse ovvio (piccoli anelli, avviso di avviso se l'etichetta / rottura non sono ancora abbastanza visibili).
Steve314,

6
@MuhammadBabar: outerloopè un'etichetta. Non so esattamente quale codice hai provato, ma il codice nella mia risposta si compila e funziona bene.
Jon Skeet,

4
@NisargPatil Solo perché è in sonarLint non lo rende un odore di codice. Significa solo che c'era uno sviluppatore che lo ha aggiunto a sonarLint con un prurito personale da grattare, ed è pieno di questo tipo di regole che hanno senso solo quando vengono abusate o perché alcuni sviluppatori hanno una crociata di odio personale nei loro confronti. Le interruzioni e le continuazioni con etichetta sono un modo molto elegante per descrivere ciò che vuoi fare.
john16384,

403

Tecnicamente la risposta corretta è etichettare il circuito esterno. In pratica, se si desidera uscire in qualsiasi punto all'interno di un ciclo interno, sarebbe meglio esternalizzare il codice in un metodo (un metodo statico se necessario) e quindi chiamarlo.

Sarebbe ripagato per la leggibilità.

Il codice diventerebbe qualcosa del genere:

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

Corrisponde all'esempio per la risposta accettata:

 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
A volte usi diverse variabili locali al di fuori del ciclo interno, passarle tutte può sembrare goffo.
Haoest

1
Quindi, come si suppone che questa soluzione stampi "Fine" come nella risposta accettata?
JohnDoe,

1
@JohnCome lo chiami e poi stampi System.out.println ("done"); provare {} infine {} all'interno del metodo di ricerca è anche un'opzione.
Zo72,

2
Questa è una pratica migliore, immagino, ma cosa succede se vuoi continuare invece di rompere? Le etichette supportano ugualmente bene (o male!) Ma non sono sicuro di come convertire questa logica per continuare.
Rob Grant,

@RobertGrant Se si desidera continuare anziché interrompere, spostare il ciclo esterno all'esterno del loopmetodo e tornare dal metodo per continuare.
Muhd,

215

È possibile utilizzare un blocco denominato attorno ai loop:

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

40
Non è necessario creare un nuovo blocco per utilizzare un'etichetta.
Jon Skeet,

81
No, ma rende l'intento molto più chiaro. Vedi il primo commento sulla risposta accettata.
Bombe,

2
non è in realtà un blocco con nome, dopo l'etichetta puoi scrivere qualsiasi espressione Java come senza etichetta, name: if(...){...}fa la condizione con nome? :)
La VloZ Merrill,

4
Questo costrutto ha un grande vantaggio rispetto all'etichettatura fordiretta. È possibile aggiungere un codice prima dell'ultimo }che verrà eseguito solo se la condizione non è mai stata soddisfatta.
Florian F,

2
È un blocco denominato e non un ciclo denominato. Non è possibile all'interno di quel ciclo "continua la ricerca;" che è totalmente una sintassi legale se il ciclo è chiamato ricerca. Puoi romperlo, ma non puoi continuare.
Tatarize

132

Non uso mai le etichette. Sembra una cattiva pratica per entrare. Ecco cosa farei:

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
Questo non dovrebbe essere && !finishedinvece di || !finished? E perché quindi utilizzare breakaffatto e non usare anche && !finishedper il ciclo interno?
Gandalf,

4
Uso breakper essere in grado di uscire arbitrariamente dal ciclo. Se c'è quel codice dopo quel ifblocco, puoi breakfarlo prima che venga eseguito. Ma hai ragione &&. Aggiustato.
Elle Mundy,

2
bella soluzione! è esattamente come lo farei in pratica se non fosse preferibile metterlo in una funzione extra per qualche motivo.
Benroth,

6
C'è un potenziale problema se c'è qualche logica dopo il ciclo interno ... che continuerà a essere eseguito e il ciclo esterno si interrompe solo quando inizia la nuova iterazione ...
Karthik Karuppannan,

7
Non capisco perché uno dovrebbe farlo in quel modo. Le persone che lavorano con il codice dovrebbero essere in grado di utilizzare tutte le funzionalità di una lingua. Capisco che è importante scrivere codice che gli altri possano capire, ma non limitando l'uso di strumenti ufficiali forniti da una lingua e trovare soluzioni alternative per la stessa funzionalità. O intendevi qualcos'altro per "cattiva pratica"?
codepleb,

107

Puoi usare le etichette:

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

4
Prendi un +1 da me. Semplice, al punto, risponde alla domanda. Non puoi essere accusato di ripetere una risposta esistente perché hai risposto contemporaneamente.
Heimdall,

40

Usa una funzione:

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

Puoi usare una variabile temporanea:

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

A seconda della tua funzione, puoi anche uscire / tornare dal loop interno:

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

7
Trovo in questo modo un po 'ingombra.
Boutta,

11
Una condizione aggiuntiva controlla ogni volta attraverso il ciclo? No grazie.
Ryandenki,

15

Se non ti piacciono le breaks e gotos, puoi usare un ciclo "tradizionale" al posto del for-in, con una condizione di interruzione extra:

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
Non adatto a prevedere anelli.
John McClane,

1
@JohnMcClane E lo stai inviando spam su molte risposte su una domanda di 9+ anni perché ...?
Quintec,

12

Avevo bisogno di fare una cosa simile, ma ho scelto di non usare il ciclo avanzato for per farlo.

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

Non trovo interessante iterare tutti gli elementi dopo che la condizione è stata risolta. Quindi aggiungerei una pausa nell'altro caso.
Boutta,

@boutta Non sono sicuro di come stai arrivando a questa conclusione. Una volta che la condizione è vera, entrambi i loop vengono chiusi.
Swifty McSwifterton,

OK, non ho ottenuto la parte con la manipolazione della varistica "s". Ma trovo quel tipo di cattivo stile poiché s rappresenta la dimensione. Poi io preferisco la risposta da ddyer con Vars esplicite: stackoverflow.com/a/25124317/15108
boutta

@boutta Puoi cambiare sin un valore che è inferiore io iin un valore maggiore o uguale a s, entrambi dovrebbero fare il trucco. Hai ragione a cambiare s, perché può essere usato altrove in seguito, ma il cambiamento inon danneggerà, solo farà in modo che il primo fornon continui in loop.
Zsolti,

9

Preferisco aggiungere una "uscita" esplicita ai test di loop. Rende chiaro a qualsiasi lettore occasionale che il loop potrebbe terminare in anticipo.

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

Non adatto a prevedere anelli.
John McClane,

8

StreamSoluzione Java 8 :

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 e ancora utile per gli altri utenti, quindi i nuovi metodi e soluzioni sono sempre i benvenuti
Andrei Suvorkov

Wow, è brutto.
DS.

7

Di solito in questi casi, rientra nell'ambito di una logica più significativa, diciamo un po 'di ricerca o manipolazione su alcuni degli oggetti' for 'iterati in questione, quindi di solito uso l'approccio funzionale:

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

Principali svantaggi:

  • circa due volte più righe
  • maggiore consumo di cicli di calcolo, il che significa che è più lento dal punto di vista algoritmico
  • più lavoro di battitura

I pro:

  • il rapporto più elevato con la separazione delle preoccupazioni a causa della granularità funzionale
  • il rapporto più elevato di riutilizzabilità e controllo della ricerca / manipolazione della logica senza
  • i metodi non sono lunghi, quindi sono più compatti e più facili da comprendere
  • rapporto più elevato di leggibilità

Quindi sta semplicemente gestendo il caso con un approccio diverso.

Fondamentalmente una domanda all'autore di questa domanda: cosa pensi di questo approccio?


6

È possibile interrompere da tutti i loop senza utilizzare alcuna etichetta: e flag.

È solo una soluzione complicata.

Qui condition1 è la condizione che viene utilizzata per interrompere dal loop K e J. E condition2 è la condizione che viene utilizzata per interrompere dal loop K, J e I.

Per esempio:

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
Come lo userei con i cicli for-each? ;)
Willi Mentzel,

5
Questo non funziona se hai una condizione di loop più sofisticata, come list.size ()> 5. Inoltre è davvero solo un trucco. È difficile da leggere e cattiva pratica!
Neurone,

È soggetto a errori. Immaginate è stato modificato il ciclo interno per (int k = 0; k < 10; k++)e non è stato risolvere tutto il k = 9a k = 10. Potresti entrare in un ciclo infinito.
Florian F,

5

Il concetto di interruzione etichettata viene utilizzato per suddividere gli anelli nidificati in Java, utilizzando l'interruzione etichettata è possibile interrompere l'annidamento degli anelli in qualsiasi posizione. Esempio 1:

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

supponiamo che ci siano 3 loop e desideri terminare il loop3: Esempio 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

Se è all'interno di una funzione, perché non la restituisci semplicemente:

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

Preferisco questo modello. Mi ha spesso causato la suddivisione dei loop in una funzione separata. Il mio codice è sempre stato migliore dopo averlo fatto, quindi per questa ragione mi piace molto questa risposta.
Bill K,

4

Metodo migliore e facile ..

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
Questi esempi di rottura non sono molto utili, perché anche senza l'etichetta si rompono nello stesso punto. Inoltre è sempre bello avere un codice che puoi effettivamente eseguire, il che non è il caso del tuo codice, poiché il ciclo interno non può mai essere raggiunto ..
Neuron,

Stavo per scrivere la stessa cosa. Le etichette sono in qualche modo inutili in questo caso.
Taslim Oseni,

4

Approccio piuttosto insolito ma in termini di lunghezza del codice ( non prestazioni ) questa è la cosa più semplice che potresti fare:

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

Un'altra soluzione, menzionata senza esempio (in realtà funziona nel codice prodotto).

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

Naturalmente BreakLoopExceptiondovrebbe essere interno, privato e accelerato con no-stack-trace:

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

1
In realtà è stato menzionato, in una risposta ottenendo -23 voti ... stackoverflow.com/a/886980/2516301 . Farà il lavoro, ma è una pessima pratica di programmazione ...
vefthym,

infatti. tuttavia ho visto un tale codice legacy: loop nidificati a 4 livelli con diverse condizioni di rottura. ed era più leggibile con le eccezioni piuttosto che con il codice incorporato. -23 voti è principalmente una valutazione emotiva, ma sì - questo approccio dovrebbe essere usato con attenzione.
Urs

1
Sarebbe stato ancora più leggibile se fosse stato suddiviso in una chiamata di funzione separata con un ritorno al centro. Spesso reso ancora migliore da un piccolo refattore, quindi ha senso come funzione autonoma (spesso riutilizzabile).
Bill K,

2

for (int j = 0; j < 5; j++) //inner loopdovrebbe essere sostituito con for (int j = 0; j < 5 && !exitloops; j++).

Qui, in questo caso, i loop nidificati completi dovrebbero essere usciti se la condizione lo è True. Ma se usiamo exitloopssolo verso l'altoloop

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

Quindi il ciclo interno continuerà, perché non vi è alcun flag aggiuntivo che notifica l'uscita di questo ciclo interno.

Esempio: if i = 3e j=2quindi condition è false. Ma nella successiva iterazione del ciclo interno, j=3 allora la condizione (i*j)diventa 9che è, truema il ciclo interno continuerà fino a jdiventare 5.

Quindi, deve usare anche exitloopsper gli anelli interni.

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

Come suggerimento @ 1800 INFORMATION, utilizzare la condizione che interrompe il loop interno come condizione sul loop esterno:

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

Se si tratta di una nuova implementazione, puoi provare a riscrivere la logica come istruzioni 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
    }
}

Altrimenti puoi provare a impostare una bandiera quando si è verificata quella condizione speciale e verificare la presenza di quella bandiera in ciascuna delle tue condizioni di loop.

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

QUI! Quindi, mentre una semplice interruzione non funzionerà, può essere fatta funzionare con continue.

Se stai semplicemente eseguendo il porting della logica da un linguaggio di programmazione a Java e vuoi solo far funzionare la cosa, puoi provare a usare le etichette .


2

Demo per break, continueelabel :

Parole chiave Java breakecontinue hanno un valore predefinito. È il "ciclo più vicino" e oggi, dopo alcuni anni di utilizzo di Java, l'ho appena preso!

Sembra usato raro, ma utile.

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

dimostrazione

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

1

Puoi fare quanto segue:

  1. imposta una variabile locale su false

  2. impostare quella variabile truenel primo ciclo, quando si desidera interrompere

  3. quindi è possibile verificare nel loop esterno che se la condizione è impostata si interrompa anche dal loop esterno.

    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

Per alcuni casi, possiamo usare il whileloop in modo efficace qui.

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 non ha una funzione goto come in C ++. Tuttavia, gotoè una parola chiave riservata in Java. Potrebbero implementarlo in futuro. Per la tua domanda, la risposta è che esiste qualcosa chiamato etichetta in Java a cui puoi applicare una continuee break. Trova il codice qui sotto:

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

Anche creando un flag per il loop esterno e verificando che dopo ogni esecuzione del loop interno possa essere la risposta.

Come questo:

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

Utilizzare conditioncome flag per quando l'elaborazione è terminata. Quindi il ciclo interno continua solo quando la condizione non è stata soddisfatta. Ad ogni modo, il circuito esterno continuerà a funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.