2010-11-18 32 views
7

Salut Je suis débutant en java et mon programme a 4 pour les boucles: mon programme fonctionne comme celui-ci que si b est true, l'élément sera retiré de PointList et n sera n-- et je veux sortir de tout pour les boucles et reviennent de la première boucle, donc l sera l++, comment puis-je faire cela? avec une déclaration de rupture?comment pouvons-nous sortir de 4 boucles internes pour?

for (int l = 0; l < n; l++) { 
    for (int i = 1; i < (n - 2); i++) { 
     for (int j = i + 1; j < (n - 1); j++) { 
      for (int k = j + 1; k < n; k++) { 
       if (l != i && l != j && l != k) { 
        boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
        System.out.println(b); 
        if (b == true) { 
         pointList.remove(pointList.get(l); 
         n--; 
         break; 
        } 
        else 
         System.out.println(b); 
       } 
      } 
     } 
    } 
} 
+0

dupliquer http: // stackoverflow.com/questions/551578/how-to-break-multiple-foreach-loop – SunnyShah

+0

Peut-être pouvez-vous décrire en quelques mots ce que vous voulez faire? "supprimer le l-ième élément si b est vrai". Votre code contient des erreurs de syntaxe. Corrigez-le, s'il vous plaît, et clarifiez votre question. – khachik

+0

On dirait que vous essayez de trouver 4 éléments qui répondent à certains critères. Si vous avez expliqué quels étaient les critères, peut-être pourrions-nous suggérer une façon plus simple de faire la même chose. par exemple. peut-être que trier la liste d'abord pourrait simplifier les boucles. –

Répondre

17

Vous pouvez utiliser une pause étiqueté comme:

 for (int l = 0; l < n; l++) { 
foo: for (int i = 1; i < (n - 2); i++) { 
      for (int j = i + 1; j < (n - 1); j++) { 
       for (int k = j + 1; k < n; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          break foo; 
         } 
         else 
          System.out.println(b); 
        } 

       } 

      } 
     } 
    } 
+0

c'est un goto déguisé, non? :) – lorenzog

+0

il cassera juste les trois derniers pour des boucles et alors il commencera avec la première boucle et ira dans ces trois pour des boucles aussi? – user472221

+1

Vous pourriez considérer toute déclaration de branchement comme un "goto déguisé" je suppose. Mais ils ont tous leurs limites et leurs usages. Même goto lui-même, en fait (les machines d'état sont un PITA sans lui). –

3
String valueFromObj2 = null; 
String valueFromObj4 = null; 
OUTERMOST: for(Object1 object1: objects){ 
    for(Object2 object2: object1){ 
    //I get some value from object2 
    valueFromObj2 = object2.getSomeValue(); 
    for(Object3 object3 : object2){ 
     for(Object4 object4: object3){ 
     //Finally I get some value from Object4. 
     valueFromObj4 = object4.getSomeValue(); 
     //Compare with valueFromObj2 to decide either to break all the foreach loop 
     if(compareTwoVariable(valueFromObj2, valueFromObj4)) { 
      break OUTERMOST; 
     } 
     }//fourth loop ends here 
    }//third loop ends here 
    }//second loop ends here 
}//first loop ends here 
+0

pris de http://stackoverflow.com/questions/551578/how-to-break-multiple-foreach-loop – SunnyShah

0

Une première solution "rapide et sale" serait d'utiliser une variable stay_into_loops et de modifier le for boucles comme:

boolean stay_into_loops = true 
// here goes the first for loop 
for (int i = 1; i < (n - 2) && stay_into_loops ; i++) { 
      for (int j = i + 1; j < (n - 1) && stay_into_loops ; j++) { 
       for (int k = j + 1; k < n && stay_into_loops ; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), `pointList.get(i), pointList.get(j), pointList.get(k));` 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          stay_into_loops = false; 
          break; 

Cependant, il est généralement une odeur de code lorsque vous rencontrez des choses comme celles-ci. Envisagez de refactoriser le code, car cela va dégénérer en un gâchis à un moment donné.

5

Dans une boucle, l'instruction break termine la boucle interne tandis que continue passe à l'itération suivante. Pour que ces deux instructions fonctionnent sur une boucle différente de la boucle interne, vous devez utiliser labels. Quelque chose comme cela devrait fonctionner:

outerloop:  
     for (int l = 0; l < n; l++) { 
      for (int i = 1; i < (n - 2); i++) { 
       for (int j = i + 1; j < (n - 1); j++) { 
        for (int k = j + 1; k < n; k++) { 
         if (l != i && l != j && l != k) { 
          boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
          System.out.println(b); 
          if (b == true) { 
           pointList.remove(pointList.get(l); 
           n--; 
           continue outerloop; 
          } 
          else 
           System.out.println(b); 
         } 

        } 

       } 
      } 
     } 
+0

parfait comme il obtient. merci –

2

Utilisez une boucle étiquetée

for (int l = 0; l < n; l++) { 
    loopa: 
    for (int i = 1; i < (n - 2); i++) { 
     for (int j = i + 1; j < (n - 1); j++) { 
      for (int k = j + 1; k < n; k++) { 
       if (l != i && l != j && l != k) { 
        boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
        System.out.println(b); 
        if (b == true) { 
         pointList.remove(pointList.get(l); 
         n--; 
         break loopa; 
        } 
        else 
         System.out.println(b); 
       } 

      } 

     } 
    } 
} 

puis pause de la boucle étiquetée

+0

il va rompre seulement les trois dernières pour les boucles, puis il va commencer avec la première boucle et va dans ces trois pour les boucles aussi? – user472221

+0

Fonctionnellement équivalent à celui du cerveau. En ce qu'il lancera dans la prochaine itération de la boucle la plus externe – stjohnroe

0

Créer une sortie pour vous-même dans chaque intérieur pour la boucle.
Voici une solution rapide et indolore.

bool breakout; 
    for (int l = 0; l < n; l++) 
    { 
     breakout = false; 
     for (int i = 1; i < (n - 2) && !breakout; i++) 
      for (int j = i + 1; j < (n - 1) && !breakout; j++) 
       for (int k = j + 1; k < n && !breakout; k++) 
       { 
        if(b == true) 
         breakout = true;        
       } 
    } 

Vous voyez le booléen breakout est votre ticket de sortie de chaque boucle intérieure, coz il est vérifié dans chaque déclaration for. Et il est réinitialisé à chaque fois que le premier for itère.

1
again: 
for (int l = 0; l < n; l++) { 
     for (int i = 1; i < (n - 2); i++) { 
      for (int j = i + 1; j < (n - 1); j++) { 
       for (int k = j + 1; k < n; k++) { 
        if (l != i && l != j && l != k) { 
         boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k)); 
         System.out.println(b); 
         if (b == true) { 
          pointList.remove(pointList.get(l); 
          n--; 
          break again; 
         } 
         else 
          System.out.println(b); 
        } 

       } 

      } 
     } 
    } 
+0

Je pense qu'il veut continuer la boucle 'for (int l ...' et ne pas sortir de celui-ci ... –

1

Je suis d'accord avec toutes les autres réponses. Cependant, je voudrais souligner qu'une alternative à exit serait de simplement mettre ce code dans sa propre routine et d'utiliser une instruction return pour sortir de l'ensemble. Votre boucle imbriquée quad est si complexe qu'elle mérite probablement d'être dans sa propre routine de toute façon.

J'ai travaillé sur des travaux DoD qui nécessitaient un cyclomatic complexity de pas plus de 6 pour une routine (avec quelques exceptions). Cette série de boucles est à elle seule de 4. Si vous ne pouvez pas trouver une façon plus simple de le faire, vous devriez vraiment les jeter dans leur propre routine juste pour préserver la santé mentale des pauvres schmucks qui doivent maintenir ce code.