web-dev-qa-db-fra.com

Comment sortir de deux boucles imbriquées?

J'utilise Java depuis quelque temps déjà, mais mon éducation en boucle manque quelque peu. Je sais créer chaque boucle existant en Java et en sortir également. Cependant, j'ai récemment pensé à ceci:

Disons que j'ai deux boucles imbriquées. Pourrais-je sortir des deux boucles en utilisant une seule instruction break?

Voici ce que j'ai jusqu'à présent.

int points = 0;
int goal = 100;
while (goal <= 100) {
    for (int i = 0; i < goal; i++) {
        if (points > 50) {
           break; // For loop ends, but the while loop does not
        }
        // I know I could put a 'break' statement here and end
        // the while loop, but I want to do it using just
        // one 'break' statement.
        points += i;
    }
}

Y a-t-il un moyen d'y parvenir?

41
fireshadow52

En Java, vous pouvez utiliser une étiquette pour spécifier la boucle à interrompre/continuer:

mainLoop:
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         break mainLoop;
      }
      points += i;
   }
}
83
sirbrialliance

Oui, vous pouvez écrire break avec label exemple:

int points = 0;
int goal = 100;
someLabel:
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         break someLabel;
      }
   points += i;
   }
}
// you are going here after break someLabel;
19

Il y a beaucoup de manières de peler ce chat. En voici un:

int points = 0;
int goal = 100;
boolean finished = false;
while (goal <= 100 && !finished) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         finished = true;
         break;
      }
   points += i;
   }
}

Mise à jour : Wow, je ne savais pas qu'il fallait rompre avec les étiquettes. Cela semble être une meilleure solution.

6
Dan Tao

Elémentaire, cher Watson ...

int points = 0;
int goal = 100;

while (goal <= 100) {
  for (int i = 0; i < goal; i++) {
    if (points > 50) {
      goal++;
      break;
    }
  points += i;
  }
}

ou

int points = 0;
int goalim = goal = 100;

while (goal <= goalim) {
  for (int i = 0; i < goal; i++) {
    if (points > 50) {
      goal = goalim + 1;
      break;
    }
  points += i;
  }
}
1
Blessed Geek

Vous pouvez réinitialiser les variables de contrôle de boucle.

int points = 0;
int goal = 100;
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         i = goal = 101;
      }
   points += i;
   }
}
0
Dipto_Das

Vous ne devez pas utiliser les étiquettes dans un langage objectif . Vous devez réécrire la condition for/while.

Donc, votre code devrait ressembler à:

int points = 0;
int goal = 100;
while (goal <= 100 && points <= 50) {
    for (int i = 0; i < goal && points <= 50; i++) {
        points += i;
    }
}

// Now 'points' is 55
0
Kacper Obrzut