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 :

imbrication boucle while


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut imbrication boucle while
    Bonsoir,
    j'ai un prb d'imbrication de boucle while.
    j'ai une HashMap qui contient l'ensemble des Id de clients, je voudrais comparer chaque client (par exp Client1 avec client2,client3,client4..) et refaire la même chose pour client2 avec client1, client3, client4..et ainsi de suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      HashMap clients = getClients();
          Iterator itr = clients.keySet().iterator(); itr.hasNext();
    while (itr.hasNext()){                    
              aClientId =((Integer)itr.next());
           rapp = getRapp(aClientId,bClientId);
     
          while (itr.hasNext()){     
              if (bClientId!=aClientId){
            bClientId =((Integer)itr.next());
            rapp = getRapp(aClientId,bClientId);
              }
    ce code me renvoie juste les résultats de l'itération entre Client1 avec le reste des clients et le fais pas pour Client2, Client3...
    j'espère que j'étais claire.
    Merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 31
    Par défaut
    salut
    ca vient du fait que tu utilises le meme iterateur dans les deux boucles.
    tu recuperer le premier element dans la boucle 1 avec itr.next()
    donc l'iterateur "pointe" vers l element no 2

    puis dans la deuxieme boucle tu fais avancer ton iterateur jusqu'a la fin de la liste

    ensuite quand tu fais une deuxieme iteration avec la primiere boucle next() retourne null parce que l iterateur utilise "pointe" ves la fin de la liste

    ++

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Merci pour ta réponse.
    En fait j'ai essayé de créer un autre itérateur en faisant:
    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
     
    HashMap clients2 = getClients();
          Iterator itr2 = clients2.keySet().iterator(); itr.hasNext();
    HashMap clients = getClients();
          Iterator itr = clients.keySet().iterator(); itr.hasNext();
     
    while (itr.hasNext()){                    
              aClientId =((Integer)itr.next());
           rapp = getRapp(aClientId,bClientId);
     
          while (itr2.hasNext()){     
              if (bClientId!=aClientId){
            bClientId =((Integer)itr2.next());
            rapp = getRapp(aClientId,bClientId);
              }
    pour pouvoir les différencier, mais ça ne marche pas vraiment.

  4. #4
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Il faut que tu remette ton 2eme interateur à 0 à chaque tour de ta repmoère boucle. Un truc 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
     
    HashMap clients2 = getClients();
     
    HashMap clients = getClients();
          Iterator itr = clients.keySet().iterator();
     
    while (itr.hasNext()){                    
              aClientId =((Integer)itr.next());
           rapp = getRapp(aClientId,bClientId);
          Iterator itr2 = clients2.keySet().iterator();      
          while (itr2.hasNext()){     
              if (bClientId!=aClientId){
            bClientId =((Integer)itr2.next());
            rapp = getRapp(aClientId,bClientId);
              }

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    j'ai essayé ton itération mais ça ne marche pas comme je veux, quand je fais un print ça me donne:
    aClient1|bClient2|Valeur(getRapport)
    aClient1|bClient2|Valeur(getRapport)
    aClient1|bClient2|Valeur(getRapport).....
    alors que je voudrais faire l'itération de cette façon pour tous les "aClient" et les "bClient":
    aClient1|bClient2|Valeur(getRapport)
    aClient1|bClient3|Valeur(getRapport)
    aClient1|bClient4|Valeur(getRapport).....
    aClient2|bClient1|Valeur(getRapport)
    aClient2|bClient3|Valeur(getRapport)
    aClient2|bClient4|Valeur(getRapport).....
    aClient3|bClient1|Valeur(getRapport)
    aClient3|bClient2|Valeur(getRapport)
    aClient3|bClient4|Valeur(getRapport).....

    j'ai essayé ce code là, mais ça m'affiche:
    aClient1|bClient2|Valeur(getRapport).....
    aClient2|bClient2|Valeur(getRapport).....
    aClient3|bClient2|Valeur(getRapport).....
    il ne fait pas toutes les itérations par aClient.
    vous auriez une meilleure idée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Iterator itr = clients.keySet().iterator(); itr.hasNext();
             while (itr.hasNext()){     
              if (bClient!=aClient){
            bClient =((Integer)itr.next());
             rapp = getRapp(aClientId,bClientId);
       Iterator itr2 = clients.keySet().iterator(); itr2.hasNext();
             while (itr2.hasNext()){                    
               bClient =((Integer)itr2.next());
             rapp = getRapp(aClientId,bClientId);
         System.out.println( aClient+"|"+ bClient+"|"+rapp);
              }

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    voici ce que tu désires.

    La première boucle est utile (car plus lisible) si tu utilises Java 5 ou 6. Sinon, utilise la seconde.

    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
    // boucle pour Java5+
    for (Integer aClientId: clients.keySet()) {
    	for (Integer bClientId: clients.keySet()) {
    		if (aClientId != bClientId) {
    			System.out.println( aClientId+"|"+ bClientId+"|"+getRapp(aClientId,bClientId));
    		}
    	}
    }
     
    // boucle pour Java 1.4 et inférieur
    for (Iterator itr = clients.keySet().iterator(); itr.hasNext();) {
    	aClientId = (Integer)itr.next();
    	for (Iterator itr2 = clients.keySet().iterator(); itr2.hasNext();) {
    		bClientId = (Integer)itr2.next();
    		if (aClientId != bClientId) {
    			System.out.println( aClientId+"|"+ bClientId+"|"+getRapp(aClientId,bClientId));
    		}
    	}
    }

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Merci, ça marche bien, par contre il fallait rajouter quand même la ligne du rapp juste avant le print:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    for (Iterator itr = clients.keySet().iterator(); itr.hasNext();) {
    	aClientId = (Integer)itr.next();
    	for (Iterator itr2 = clients.keySet().iterator(); itr2.hasNext();) {
    		bClientId = (Integer)itr2.next();
    		if (aClientId != bClientId) {
    rapp = getRapp(aClientId,bClientId);
    			System.out.println( aClientId+"|"+ bClientId+"|"+getRapp(aClientId,bClientId));
    		}
    	}
    }
    j'ai une autre petite question, sur Eclipse j'arrive pas à récupérer tt le contenu des résultats affichés (ClientId+"|"+ bClientId+"|"+rapp) sur la console. quand le processus est terminé, je n'ai que 10% des derniers résultats qui restent affichés (~3000 lignes) alors qu'il y en a 400000 et il les a bien affichés au début.

  8. #8
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    LA console à un nombre de ligne maximum dans la console. Si tu dépasse ne nombre tu écrase les premières lignes créées. Pour palier à ce problème tu peux faire l'écriture dans un fichier au lieu de la console.

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    t'avais bien raison, je viens de faire l'écriture de l'output dans un fichier et ça marche
    Merci!!!!

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

Discussions similaires

  1. [MySQL] Imbrication boucles while avec mysql_fetch_row
    Par whoaloic dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/02/2011, 16h25
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 16h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 18h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 23h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 16h20

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