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

Collection et Stream Java Discussion :

iterator et comparaison


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut iterator et comparaison
    salut

    je désire vérifier dans deux linkedlist les éléments qui ont correspondance et faire un traitement...

    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
     
     
        List listCheque101 = new LinkedList();
        List listCheque100 = new LinkedList();
     
         ....
     
        public void matchCheque(){
            Iterator it100=listCheque100.iterator();
            Iterator it101=listCheque101.iterator();
     
            while (it100.hasNext()){ // tant que j'ai un element non parcouru
                Cheque o100 = (Cheque) it100.next();
     
                while (it101.hasNext()){ // tant que j'ai un element non parcouru
                    Cheque o101 = (Cheque) it101.next();
     
                    //si les données sont identique, il y a addition des nombres de cheque
                    if(o100.getFederation().equals(o101.getFederation()) &&
                            o100.getCaisse().equals(o101.getCaisse()) &&
                            o100.getGuichet().equals(o101.getGuichet()) &&
                            o100.getDateCollecte().equals(o101.getDateCollecte()) &&
                            o100.getHeureCollecte().equals(o101.getHeureCollecte()) ){
                        o100.setNbCheque(o100.getNbCheque() + o101.getNbCheque());
     
                        //ne passe jamais ici
     
                    }
                }
            }
        }
    si je fais affiché le contenu de listCheque100, j'obtiens

    815 92276 04 2007-05-13 20:06:10 339
    815 20184 84 2007-05-13 21:03:53 152
    815 20426 66 2007-05-13 20:33:57 164

    si je fais affiché le contenu de listCheque101, j'obtiens
    815 20184 84 2007-05-13 21:03:53 2
    815 20426 66 2007-05-13 20:33:57 1


    il y a donc une correspondance avec la deuxième ligne de listCheque100 et la première ligne de listCheque101...

    pourtant il passejamais à l'intérieur du if....
    une idée?

    merci

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    J'ai pas vu où si situe l'erreur mais voici un conseil :
    - plutot que de comparer dans tes boucles chaque champs, redéfini la méthode equals() dans ta classe Cheque.
    - lorsque tu auras défini la méthode equals, tu n'auras plus besoin de faire deux boucles imbriquées, une seule suffira : la boucle itérera sur chaque objet contenu dans la première liste, ensuite il suffit d'utiliser la méthode contains() sur ta liste numéro deux ( if(maListeDeux.contains(monChèque)){... ). "Contains" utilise la méthode "equals" des objets pour tester l'inclusion. ;-)

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    A lire ton code, j'ai l'impression que ton but est de comparer CHAQUE chèque de ta première liste à CHAQUE chèque de la seconde, je me trompe?

    Or ce que fait ton code, c'est comparer le PREMIER chèque de ta première liste à chaque chèque de la seconde! Comme ta correspondance est pour le deuxième élément de ta première liste, tu ne fais effectivement pas le traitement voulu.

    Il faut régénérer l'itérateur it101 pour chaque traitement d'un chèque de ta première liste avant de faire ton 2ème while.

    Sinon, je suis d'accord pour la surcharge de la méthode equals
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre éprouvé Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Par défaut
    Tu peux aussi utiliser la méthode boolean retainAll(Collection) de List.
    Ainsi tu fait une copie d'une de tes listes et retient ce qu'il y a dans l'autres; bien sûr tu dois redéfinir la méthode equals comme dit dans les précédents post

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List tmp = new ArrayList(listCheque100);
    tmp.retainAll(listCheque101);
    System.out.println(tmp);

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut
    en plein ça CyberChouan

    ok j'ai corrigé le problème concernant les deux boucle while

    maintenant je veux tenter de mettre en oeuvre la solution à une boucle

    voici ce que j'ai écrit (pas testé pas de compilo où je suis...)
    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
     
     
    //dans ma classe chèque
    public boolean equals(Cheque cheque){
     
            if(this.getFederation().equals(cheque.getFederation()) &&
                            this.getCaisse().equals(cheque.getCaisse()) &&
                            this.getGuichet().equals(cheque.getGuichet()) &&
                            this.getDateCollecte().equals(cheque.getDateCollecte()) &&
                            this.getHeureCollecte().equals(cheque.getHeureCollecte()) ){
     
                 this.setNbCheque(this.getNbCheque()+ cheque.getNbCheque());
     
                return true;
            }
            return false;
        }

    ensuite je boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Iterator it100=listCheque100.iterator();
    while (it100.hasNext()){ 
        Cheque o100 = (Cheque) it100.next();
       if(it100=listCheque100.contains(Cheque)){
     
            /*
                fait ce qu'on veux
            */
     
        }
    }

    alors c'est gagnant?

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par robert_trudel
    alors c'est gagnant?
    Heu... en fait NON! Apparemment tu as un peu de mal avec les différents objets...

    Tout d'abord (c'est technique), il faudrait que tu surcharges la méthode equals(Object) pour être propre.

    Ensuite, que vient faire une affectation dans une méthode "equals()"?... cette ligne est presque une hérésie de conception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.setNbCheque(this.getNbCheque()+ cheque.getNbCheque());
    Et enfin, la ligne de test qui est incompréhensible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(it100=listCheque100.contains(Cheque)) {
       // ...
    }
    un égal simple => affectation, et non comparaison d'égalité
    que viens faire it100 (qui est un iétareur) dans ce test?
    tu appliques contains à "Cheque" alors que tu veux certainement l'appliquer à cheque
    la méthode contains() te renvoie déjà un booleen... pourquoi veux-tu le comparer à autre chose?...


    Bref, je pense que tu devrais revoir calmement les bases de java avant de t'attaquer à ton problème de chèques
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

Discussions similaires

  1. Iteration VS recursivité
    Par yacinechaouche dans le forum C
    Réponses: 40
    Dernier message: 16/11/2012, 11h52
  2. comparaison de 2 dates
    Par eisti dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2003, 11h33
  3. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 11h49
  4. Comparaison JBuilder avec Sun ONE Studio
    Par chichos dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 13/11/2002, 15h08
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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