comment pouvons-nous sortir de 4 intérieur pour les boucles?
-
26-09-2019 - |
Question
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 toutes les boucles et viennent à nouveau de la première boucle si l
sera l++
, comment je fais ça ? avec instruction break?
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);
}
}
}
}
}
La solution
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);
}
}
}
}
}
Autres conseils
Dans une boucle l'instruction break
met fin à la boucle interne tandis que saute continue
à l'itération suivante. Pour que ces deux déclarations de travailler sur une boucle différente de celle intérieure vous devez utiliser étiquettes . 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);
}
}
}
}
}
Jetez un oeil à l'instruction break étiqueté
par exemple ici: Déclarations Branching
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
utiliser une boucle marqué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);
}
}
}
}
}
et ensuite rompre la boucle marquée
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);
}
}
}
}
}
Je suis d'accord avec toutes les autres réponses. Cependant, je voudrais souligner qu'une solution de rechange à exit
serait de mettre juste ce code dans sa propre routine et utiliser une instruction return
pour sortir de la chose. Votre boucle imbriquée quad-est si complexe en lui-même qu'il mérite probablement d'être dans sa propre routine de toute façon.
J'ai travaillé sur les emplois DoD qui ont nécessité une complexité cyclomatique de plus de 6 pour une routine (à quelques exceptions près). Cette série de boucles est seul 4. Si vous ne pouvez pas trouver un moyen 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.
Une première solution « rapide et sale » serait d'utiliser une variable stay_into_loops
et modifier les boucles for
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 quand vous rencontrez des choses comme celles-ci. Considérez refactorisation le code parce que cela va dégénérer en désordre à un moment donné.
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;
}
}
Donc, 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 de for
.
Et il se réinitialiser à chaque fois que la première itération for
.