J'ai une construction de boucle imbriquée comme ceci:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Maintenant, comment puis-je sortir des deux boucles? J'ai examiné des questions similaires, mais aucune ne concerne spécifiquement Java. Je n'ai pas pu appliquer ces solutions car la plupart des gotos utilisés.
Je ne veux pas mettre la boucle intérieure dans une méthode différente.
Je ne veux pas relancer les boucles. A la rupture, j'ai terminé l'exécution du bloc de boucle.
la source
break
. Même alors, les exceptions sont une autre exception plus connue (désolé). Mais je serais toujours mécontent de cela si ce n'était pas évident (petites boucles, commentaire d'avertissement si le label / break n'est toujours pas assez visible).outerloop
est une étiquette. Je ne sais pas exactement quel code vous avez essayé, mais le code dans ma réponse se compile et fonctionne très bien.Techniquement, la bonne réponse consiste à étiqueter la boucle extérieure. En pratique, si vous souhaitez quitter à tout moment à l'intérieur d'une boucle interne, vous feriez mieux d'externaliser le code dans une méthode (une méthode statique si nécessaire), puis de l'appeler.
Cela serait payant pour la lisibilité.
Le code deviendrait quelque chose comme ça:
Correspond à l'exemple de la réponse acceptée:
la source
loop
méthode et revenez de la méthode pour continuer.Vous pouvez utiliser un bloc nommé autour des boucles:
la source
name: if(...){...}
fait la condition nommée? :)for
direct. Vous pouvez ajouter du code avant le dernier}
qui sera exécuté uniquement si la condition n'a jamais été remplie.Je n'utilise jamais d'étiquettes. Cela semble être une mauvaise pratique. Voici ce que je ferais:
la source
&& !finished
place|| !finished
? Et pourquoi alors utiliserbreak
du tout et ne pas utiliser aussi&& !finished
pour la boucle intérieure?break
pour pouvoir sortir arbitrairement de la boucle. S'il y a du code après ceif
bloc, vous pouvez le fairebreak
avant son exécution. Mais vous avez raison&&
. A corrigé.Vous pouvez utiliser des étiquettes:
la source
Utilisez une fonction:
la source
Vous pouvez utiliser une variable temporaire:
Selon votre fonction, vous pouvez également quitter / revenir de la boucle interne:
la source
Si vous n'aimez pas les
break
s et lesgoto
s, vous pouvez utiliser une boucle for "traditionnelle" à la place du for-in, avec une condition d'abandon supplémentaire:la source
J'avais besoin de faire une chose similaire, mais j'ai choisi de ne pas utiliser la boucle for améliorée pour le faire.
la source
s
à une valeur inférieure ài
ou changeri
à une valeur supérieure ou égale às
, les deux devraient faire l'affaire. Vous avez raison de changers
, car il peut être utilisé ailleurs plus tard, mais le changementi
ne nuira pas, vous garantira simplement que le premierfor
ne continuera pas à boucler.Je préfère ajouter une "sortie" explicite aux tests de boucle. Il indique clairement à tout lecteur occasionnel que la boucle peut se terminer plus tôt.
la source
Stream
Solution Java 8 :la source
Habituellement, dans de tels cas, cela entre dans le cadre d'une logique plus significative, disons quelques recherches ou manipulations sur certains des objets `` pour '' itérés en question, donc j'utilise généralement l'approche fonctionnelle:
Contre majeur:
Les avantages:
Il s'agit donc simplement de gérer le cas via une approche différente.
Fondamentalement, une question à l'auteur de cette question: que pensez-vous de cette approche?
la source
Vous pouvez interrompre toutes les boucles sans utiliser d'étiquette: et de drapeaux.
C'est juste une solution délicate.
Ici condition1 est la condition qui est utilisée pour rompre les boucles K et J.Et condition2 est la condition qui est utilisée pour rompre les boucles K, J et I.
Par exemple:
la source
(int k = 0; k < 10; k++)
vous n'a pas résolu tous lesk = 9
àk = 10
. Vous pourriez entrer dans une boucle infinie.Le concept de rupture étiquetée est utilisé pour séparer les boucles imbriquées en java, en utilisant la rupture étiquetée, vous pouvez interrompre l'imbrication des boucles à n'importe quelle position. Exemple 1:
supposons qu'il y ait 3 boucles et que vous vouliez terminer la boucle3: Exemple 2:
la source
la source
S'il se trouve dans une fonction, pourquoi ne le renvoyez-vous pas:
la source
Meilleure méthode et facile ..
la source
Approche plutôt inhabituelle mais en termes de longueur de code ( pas de performances ), c'est la chose la plus simple que vous pourriez faire:
la source
Utilisez des étiquettes.
Consultez cet article
la source
Une autre solution, mentionnée sans exemple (elle fonctionne en fait dans le code prod).
Bien sûr, il
BreakLoopException
doit être interne, privé et accéléré sans trace de pile:la source
for (int j = 0; j < 5; j++) //inner loop
doit être remplacé parfor (int j = 0; j < 5 && !exitloops; j++)
.Ici, dans ce cas, les boucles imbriquées complètes doivent être sorties si la condition est
True
. Mais si nous utilisonsexitloops
uniquement à la partie supérieureloop
Ensuite, la boucle interne se poursuivra, car il n'y a pas d'indicateur supplémentaire qui avertit cette boucle interne de quitter.
Donc, il doit aussi utiliser
exitloops
les boucles intérieures.la source
Comme la suggestion @ 1800 INFORMATION, utilisez la condition qui rompt la boucle intérieure comme condition sur la boucle extérieure:
la source
S'il s'agit d'une nouvelle implémentation, vous pouvez essayer de réécrire la logique en tant qu'instructions if-else_if-else.
Sinon, vous pouvez essayer de définir un indicateur lorsque cette condition spéciale s'est produite et vérifier cet indicateur dans chacune de vos conditions de boucle.
ICI! Ainsi, même si une simple pause ne fonctionnera pas, elle peut être effectuée en utilisant
continue
.Si vous portez simplement la logique d'un langage de programmation vers Java et que vous voulez simplement faire fonctionner la chose, vous pouvez essayer d'utiliser des étiquettes .
la source
Demo pour
break
,continue
etlabel
:Mots
break
- clés Java etcontinue
ont une valeur par défaut. C'est la "boucle la plus proche", et aujourd'hui, après quelques années d'utilisation de Java, je viens de la comprendre!Il semble utilisé rare, mais utile.
la source
Démo
la source
Vous pouvez effectuer les opérations suivantes:
définir une variable locale sur
false
définissez cette variable
true
dans la première boucle, lorsque vous voulez romprevous pouvez ensuite vérifier dans la boucle externe, que si la condition est définie, puis rompre également avec la boucle externe.
la source
Dans certains cas, nous pouvons utiliser la
while
boucle efficacement ici.la source
Java n'a pas de fonction goto comme en C ++. Mais encore,
goto
est un mot-clé réservé en Java. Ils pourraient l'appliquer à l'avenir. Pour votre question, la réponse est qu'il existe quelque chose appelé étiquette en Java auquel vous pouvez appliquer une instructioncontinue
andbreak
. Trouvez le code ci-dessous:la source
Même la création d'un indicateur pour la boucle externe et la vérification qu'après chaque exécution de la boucle interne peut être la réponse.
Comme ça:
la source
À utiliser
condition
comme indicateur lorsque vous avez terminé le traitement. Ensuite, la boucle intérieure continue uniquement tant que la condition n'est pas remplie. Quoi qu'il en soit, la boucle extérieure continuera de chuggin '.la source