web-dev-qa-db-fra.com

Comment puis-je rompre avec la boucle principale / externe dans une boucle double / imbriquée?

Si j'ai une boucle dans une boucle et une fois qu'une instruction if est satisfaite, je veux rompre la boucle principale, comment suis-je censé faire cela?

Voici mon code:

for (int d = 0; d < amountOfNeighbors; d++) {
    for (int c = 0; c < myArray.size(); c++) {
        if (graph.isEdge(listOfNeighbors.get(d), c)) {
            if (keyFromValue(c).equals(goalWord)) { // Once this is true I want to break main loop.
                System.out.println("We got to GOAL! It is "+ keyFromValue(c));
                break; // This breaks the second loop, not the main one.
            }
        }
    }
}
38
Shepard

Utilisation d'une pause étiquetée:

mainloop:
for(){
 for(){
   if (some condition){
     break mainloop;
   }
  }
}

Voir aussi

60
Jigar Joshi

Vous pouvez ajouter des étiquettes à votre boucle et utiliser cette labelled break pour sortir de la boucle appropriée: -

outer: for (...) {
    inner: for(...) {
        if (someCondition) {
            break outer;
        }
    }
}

Voir ces liens pour plus d'informations:

27
Rohit Jain

Vous pouvez simplement return le contrôle de cette fonction. Ou utilisez le laid break labels approche :)

S'il existe d'autres parties de code après votre instruction for, vous pouvez refactoriser les boucles dans une fonction.

OMI, l'utilisation des pauses et de la poursuite doit être déconseillée dans la POO, car elles affectent la lisibilité et la maintenance. Bien sûr, il y a des cas où ils sont pratiques, mais en général, je pense que nous devrions les éviter, car ils encourageront l'utilisation de la programmation goto.

Apparemment, des variations de ces questions sont souvent publiées. Ici Peter a fourni quelques bonnes et étranges utilisations en utilisant des étiquettes.

12
dan

Il ressemble à Java une rupture étiquetée semble être la voie à suivre (basée sur le consensus des autres réponses).

Mais pour beaucoup (la plupart?) D'autres langues, ou si vous voulez éviter tout goto comme le flux de contrôle, vous devez définir un indicateur:

bool breakMainLoop = false;
for(){
    for(){
        if (some condition){
            breakMainLoop = true;
            break;
        }
    }
    if (breakMainLoop) break;
}
3
Thymine

Juste pour le fun:

for(int d = 0; d < amountOfNeighbors; d++){
    for(int c = 0; c < myArray.size(); c++){
        ...
            d = amountOfNeighbors;
            break;
        ...
    }
    // No code here
}

Commenter break label: c'est un goto avant. Il peut casser n'importe quelle déclaration et passer à la suivante:

foo: // Label the next statement (the block)
{
    code ...
    break foo;  // goto [1]
    code ...
}

//[1]
2
irreputable

Les méthodes les meilleures et les plus faciles pour les débutants, même:

outerloop:

for(int i=0; i<10; i++){

    // Here we can break the outer loop by:
    break outerloop;

    innerloop:

    for(int i=0; i<10; i++){

        // Here we can break innerloop by:
        break innerloop;
    }
}
0
Keshav bansal