IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Quitter une boucle for


Sujet :

Langage Java

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Quitter une boucle for
    Bonjour,

    J'ai une boucle for que je souhaiterais quitter quand je suis passer dans un de mes if mais je vois pas comment faire proprement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (Entry<Integer, Integer> mapEntry : map.entrySet()) {
    if(...){
     
    }else if (...){
     
    }else if(...){
     
    }
    }

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je chercher un truc plus propre que le break

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    plus "propre"? En quoi le break est sale?

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Personnellement quand j'en arrive à des trucs qui ressemblent à ça je préfère un return, ça isole les codes les uns des autres et puis ça colle un nom à ce que je fais dans cette boucle.

    Mais oui, on peut se demander d'où vient cette idée de "pas propre."

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je veux si je passe dans le if, quitter la boucle car j'ai rempli une condition.
    Mon problème c'est que je trouve pas très propre de mettre plein de break

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu ne peux pas sortir d'un forEach autrement que par un break, ou un return (Enfin, je te dirais bien qu'il y a aussi le System.exit() pour sortir de la boucle, mais c'est un peu radical...) si ta boucle est dans une méthode (on sort de la méthode, donc on sort de la boucle). Parce qu'il n'y a de toute manière pas de contexte de gestion de boucle (pas de moyen d'agir sur une condition de bouclage) et pas d'autre moyen de sortir que break (vu que c'est fait pour ça). Et je ne vois trop où est le problème (d'utiliser break dans ce cas).

    Si le break te file des cauchemars (je me demande comment tu fais avec un switch pour te passer de break), avec un for, on pourrait mettre en place un boolean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    boolean loop=true;
    for(int i=0; loop & i<nb; i++) {
         if ( ... ) {
     
             loop=false;
     
        }
    }
    Avec une boucle sur itérateur, on pourrait "vider" l'itérateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while( iterator.hasNext() ) {
     
           iterator.next();
     
           if ( ... ) {
     
              while( iterator.hasNext() ) iterator.next();
     
          }
     
    }
    Mais autant mettre un break (ne serait-ce que pour éviter de passer du temps et consommer de la mémoire pour aller au boutl'itérateur). Et c'est moins lisible, plus compliqué...

    Ou alors tu filtres avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Optional<Entry<Integer, Integer>> opt = map.entrySet().stream().filter(e-> {
        if ( ... || ... || ... ) {
            return e;
        }
        return null;
    } ).filter(Objects::nonNull).findFirst();
    opt.ifPresent(e-> {
      if ( ... ) {
      }
      else if ( ... ) {
      }
      else if ( ... ) {
      }
     
    });
    On voit pas de break, mais c'est nettement plus compliqué... et on multiplie les tests... et la première boucle revient à tout parcourir (mais on ne réagit que sur le premier qui matche l'une des conditions, donc fonctionnellement c'est bon)

    A voir si le problème ne peut pas se résoudre en changeant la façon de le traiter. Du genre, si on veut tester si les clefs sont valides
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set<String> invalidKeys = map.keySet().stream().filter(k-> !isValid(k)).collect(Collectors.toSet());
    if ( invalidKeys.isEmpty() ) {
       // ok
    }
    else {
      // ko - et on a la liste des clefs invalides au besoin
    }



    Je ne sais pas si elles seront propres ou sales, mais toute autre soluton sera plus allambiquées/compliquées, et moins performante.

  8. #8
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 325
    Points : 3 769
    Points
    3 769
    Billets dans le blog
    12
    Par défaut
    Bonsoir totot,

    Tu as créé le même sujet il y a moins d'une semaine (je t'ai même répondu).

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Si j'utilise un return dans chaque if. Il ne va pas continuer mon for si je passe dans un if et donc que je fait le return?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    le principe du return c'est comme le break, ça interrompt immédiatement le travail. Le return arrête le travaille sur la méthode, le break le travail sur la boucle.

Discussions similaires

  1. quitter en force une boucle for!
    Par Sieur_Blabla dans le forum Ada
    Réponses: 4
    Dernier message: 17/08/2009, 20h58
  2. quitter une boucle for
    Par Invité(e) dans le forum ASP
    Réponses: 2
    Dernier message: 22/04/2008, 19h22
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 13h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 21h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo