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 :

plusieurs conditions avec foreach


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut plusieurs conditions avec foreach
    Bonjour !
    Je n'arrive pas a faire plusieurs condition dans une boucle foreach
    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (Object elmt : liste && .... )||(..){}
    il ya bien une solution avec un break mais ya til un autre moyen.
    J'ai regardé sur google, mais je ne trouve pas de solutions.
    Autre question, quelqu'un aurait t'il un site bien fait sur tiger?
    Merci.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par decksroy
    Je n'arrive pas a faire plusieurs condition dans une boucle foreach
    la boucle foreach n'est pas faite pour cela, mais pour parcourir tout les éléments !

    Mis à part le break, il faut alors utiliser l'Iterator "comme au bon vieux temps"


    Citation Envoyé par decksroy
    Autre question, quelqu'un aurait t'il un site bien fait sur tiger?
    Tiger: la révolution de Java 5

    Après ca dépend de ce que tu veux traiter en particulier... mais il n'y a pas vraiment de site "special tiger"...

    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    Justement avant je le faisais avec un iterator, et je m'amuse a le faire en 1.5 ou je n'y connais rien
    je voudrais dans ce foreach ajouter un boolean a la condition
    du style ; && good=true
    C'est sur ya pas moyen?
    d'ailleurs j'ai une autres question a propos du foreach
    voyez ce code :
    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
    16
    17
    18
    19
     
    while(!items.isEmpty()){
    			good=false ;
    			MenuTreeListItem menuList = vector.firstElement() ;
    			for(MenuTreeListItem element : items){
    				if(element.getNumParent().equals(menuList.getNumItem())){
    					menuList.addChild(element);
    					vector.insertElementAt(element,0);
    					items.remove(element);
    					good = true;
    				}
    				if(!good)break;
     
    			}
    			if(!good)
    			{
    				vector.removeElementAt(0);
    			}
    		}
    J'ai l'exception : java.util.ConcurrentModificationException au moment du deuxieme tour dans le for
    Kesako?
    Si ca peut aider j'ai l'ancienne version en 1.4 qui marche.
    Merci.

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Concernant la boucle for, il faut utiliser la forme classique si l'on veut finasser avec la condition ; ou, comme te le dis adiGuba, se faire son petit iterator. (Et plus précisement un Iterable).

    Concernant l'exception, je pense que c'est parce que tu modifies la collection sur laquelle tu boucles dans ta boucle, par l'instruction items.remove.... Si tu veux faire cela, il faut passer par l'itérator (et donc par la forme classique de la boucle for), sur le modèle iterator.remove....

    (ou mieux, ne pas du tout modifier la collection parcourue pendant le traitement, solution que j'applique toujours et qui me parait la plus éléguante). (sauf en de trés rares exceptions qui confirment la règle).

  5. #5
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Concernant l'exception, je pense que c'est parce que tu modifies la collection sur laquelle tu boucles dans ta boucle, par l'instruction items.remove.
    Exact. Il ne faut pas le faire.
    ou mieux, ne pas du tout modifier la collection parcourue pendant le traitement, solution que j'applique toujours et qui me parait la plus éléguante
    C'est ce qu'il faut faire. Petite note : on écrit "élégante" .

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    J'abuse peut etre un peu, mais pourriez vous me donner la solution sans modifier la collection parcourue.
    En attendant j'y reflechis un peu...
    Merci.

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ah ! Ah !

    Je fais quelque chose du genre :
    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
     
    ArrayList àsupprimer;
     
    for(MenuTreeListItem element : items)
    {
     if(element.getNumParent().equals(menuList.getNumItem()))
     {
      menuList.addChild(element);
      vector.insertElementAt(element,0);
      àsupprimer.add(element);
      good = true;
     }
    }
    for (MenuTreeListTiem item : àsupprimer)
     items.remove(item);

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    c'est normal que tu n'es pas d'erreur, tu ne rentre pas dans le premier for apres ton deuxieme for
    J'aimerais faire quelque chose de ce style mais qui marcherait
    Apres le deuxieme parcours j'ai toujours l'exception "Concurrent...".
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    boolean good = true ;
    MenuTreeListItem item ;
    MenuTreeGroupModel rootModel = new MenuTreeGroupModel(false,0,0,"","0","","","",null)  ;
     
    Vector <MenuTreeListItem> vector = new Vector<MenuTreeListItem> () ;
    int index = 1 ;
    vector.add(rootModel) ;
     
    Vector <MenuTreeListItem> v;
     
    while(!items.isEmpty()){
    	for(MenuTreeListItem element : vector)
            {
    		v = new Vector<MenuTreeListItem> ();		
    		for(MenuTreeListItem filsItem : items)
                    {
    			if(filsItem.getNumParent().equals(element.getNumItem()))
                           {
    						v.add(filsItem) ;
    			}
    		}
    		Collections.sort(v,new Comparator<MenuTreeListItem>()
                   {
    		 public int compare(MenuTreeListItem o1, MenuTreeListItem o2)                                                                                                   
                     {
     
    			return o1.getNumSeq() - o1.getNumSeq();
    		  }
                     });
                    index=1 ; 
    	        for(MenuTreeListItem elements : v)
                    {
    	          elements.setNumSeq(index++) ;
    	        }
    	        items.removeAll(v) ;
    	        vector.addAll(v) ;
          }
    }
    Je comprends bien que mon probleme vien du items.removeAll(v)
    Mais j'aimerais supprimer ces elements que j'ai mis dans le vecteur pour pouvoir iterer sur les suivants.
    Et tout seul je n'y arrive pas!
    Merci.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    oups!
    non mon erreur ne vient pas de "items", enfin pas pour l'instant.
    il vient du "vector"( vector.addAll(v) );juste au moment ou je rentre dans le deuxieme for.
    desolé pour la confusion, mais l'envie de trouver le probleme est toujours la,
    alors un petit don ne sera pas de refus.

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par decksroy
    non mon erreur ne vient pas de "items", enfin pas pour l'instant.
    il vient du "vector"( vector.addAll(v) );juste au moment ou je rentre dans le deuxieme for.
    Désolé mais le code n'est pas forcément très lisible... surtout lorsqu'on ignore complètement le but de cet algo...

    Citation Envoyé par decksroy
    desolé pour la confusion, mais l'envie de trouver le probleme est toujours la,
    alors un petit don ne sera pas de refus.
    De quel erreur parles-tu ? De la ConcurrentModificationException ?
    Si c'est cela la réponse t'a été donné : il faut utiliser la méthode remove() de l'Iterator (et donc la boucle classique).

    a++

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    De quel erreur parles-tu ? De la ConcurrentModificationException ?
    Si c'est cela la réponse t'a été donné : il faut utiliser la méthode remove() de l'Iterator (et donc la boucle classique).
    Oui je parlais encore de celle la, mais je demande une reponse plus precise, enfin je demandais.
    Je crois qu'il va falloir que je me debrouille tout seul...

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par decksroy
    Oui je parlais encore de celle la, mais je demande une reponse plus precise, enfin je demandais.
    Je crois qu'il va falloir que je me debrouille tout seul...
    C'est à dire ? Que veux-tu dire par une réponse plus précise ?

    Lorsque tu parcours une collection avec un Iterator, tu ne peux pas la modifier (ajouter ou supprimer des éléments) sauf en utilisant les méthode de l'Iterator...


    a++

  13. #13
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Quelqu'un peut-il faire un résumé ?... Je ne comprends plus rien.

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gifffftane
    Quelqu'un peut-il faire un résumé ?... Je ne comprends plus rien.
    Lorsqu'on veut simplement parcourir les éléments d'un tableau ou d'une Collection (plus précisément de toute classe qui implémente Iterable), on peut utiliser directement la boucle for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Type nomVariable : collection) {
    	// On utilise nomVariable
    }
    Il faut noter que cette boucle utilise en fait l'Iterator pour parcourir les éléments...



    Mais lors du parcours d'une collection avec un Iterator, il ne faut pas modifier la collection source car cela provoquera une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (Type nomVariable : collection) {
    	// On utilise nomVariable
     
    	collection.remove(); // => ConcurrentModificationException
    }
    En effet les implémentations des Iterators de l'API standard sont "fail-fast". C'est à dire qu'ils provoqueront une erreur dès qu'ils rencontrent un "problème" sans tenter de le résoudre...

    En effet, la modification de la collection pendant son parcours peut provoquer un grand nombre de problème qu'il n'est pas forcément facile à détecter et à résoudre... Donc générer une exception au plus tôt est une manière de prévenir le developpeur qu'il doit modifier son code


    Ainsi, lorsqu'on veut parcourir une collection pour la modifier, il faut obligatoirement utiliser la méthode remove() de l'Iterator, et donc parcourir la colelction "a l'ancienne" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Iterator<String> iterator = collection.iterator();
    while (iterator.hasNext()) {
    	String nomVariable = iterator.next();
    	// On utilise nomVariable
    	iterator.remove();
    }

    a++

  15. #15
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Merci, mais je voulais dire que je ne comprenais plus rien aux questions, pas aux réponses

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    Merci pour ton explication adiGuba, je crois que maintenant j'ai compris, j'essaye de faire cela, et je vous tiens au courant.


    Merci, mais je voulais dire que je ne comprenais plus rien aux questions, pas aux réponses
    Si, si, je t'assure je vais faire un effort, j'avoue que je me suis moi meme embrouillé.Surtout que je me suis eloigné du sujet.

    merci pour votre patience.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 331
    Par défaut
    maintenant c'est sur, j'ai bien compris l'iterator.
    Encore merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Mise à jour de plusieurs colonnes avec foreach
    Par budiartaaa dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 09/11/2010, 23h53
  2. Having avec plusieurs conditions ?
    Par jchatard dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/04/2007, 16h58
  3. Si je fais un if() avec plusieurs conditions ..
    Par Pauli dans le forum Langage
    Réponses: 2
    Dernier message: 25/01/2007, 17h47
  4. like avec plusieur condition
    Par wayak3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2007, 12h43
  5. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 10h04

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