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

Java Discussion :

Tri d'une List en fonction de 3 criteres (nom, DateDebut, DateFin)


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Par défaut Tri d'une List en fonction de 3 criteres (nom, DateDebut, DateFin)
    J'ai implementé un comparator pour faire le tri en fonction de 3 criteres (nom, dateDebut et dateFin).

    J'ai appelé la méthode Collections.sort(List, new ObjetVoComparator())

    Apres, J'ai affiché la liste trié et les elements ne le sont pas.

    Voici le code du comparator :

    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
     
     
    @Override
        public int compare(AffretementVO pO1, AffretementVO pO2) {
            String sousTraitant1 = pO1.getSousTraitant();
            String sousTraitant2 = pO2.getSousTraitant();
     
            Date dateDebut1 = pO1.getDebutPeriode();
            Date dateDebut2 = pO2.getDebutPeriode();
     
            Date dateFin1 = pO1.getFinPeriode();
            Date dateFin2 = pO2.getFinPeriode();
     
            if(!sousTraitant1.equals(sousTraitant2)) {
                return 0;
            } else {
                if(!dateDebut1.equals(dateDebut2)) {
                    return 0;
                } else {
                    if(!dateFin1.equals(dateFin2)) {
                        return 0;
                    } else {
                        return 1;
                    }
                }
            }
     
        }
    LOG Affichée :
    TRP88170-0002 - 2011-12-05 - 2011-12-11
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-10-10 - 2011-10-20
    TRP88170-0002 - 2011-12-05 - 2011-12-11
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-11-28 - 2011-12-04

    Le tri sur le premier critere nom se fait correctement mais les dates non, le résultat attendu est le suivant :

    TRP88170-0002 - 2011-10-10 - 2011-10-20
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-11-28 - 2011-12-04
    TRP88170-0002 - 2011-12-05 - 2011-12-11
    TRP88170-0002 - 2011-12-05 - 2011-12-11

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne sais pas ce que tu croyais, mais la méthode compare() doit renvoyer :
    - 0 si les deux objets sont égaux
    - un nombre strictement négatif si le premier objet est strictement inférieur au second
    - un nombre strictement positif si le premier objet est strictement supérieur au second

    Or, ta méthode :
    - passe son temps à renvoyer 0 quand certaines propriétés ne sont pas égales.
    - ne renvoie jamais de nombre négatif.

    Deux raisons pour lesquelles elle est forcément incorrecte.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Salut,

    D'apres la javadoc de Comparator, public int compare(Object o1, Object o2) doit renvoyer une valeur :
    < 0 si o1 < o2
    = 0 si o1 = o2
    > 0 si o1 > o2.

    Dans ton cas, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!sousTraitant1.equals(sousTraitant2)) {
       return 0;
    }
    Donc tu renvoies 0 si ils sont differents. A mon avis, le resultat que tu obtiens depend de l'ordre dans lequel tu inseres tes données.
    Bref, il faut reprendre ton comparateur

    EDIT : grilled

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Par défaut
    Il faillais que j'utilise le compareTo au lieu du equals :

    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
     
    if(sousTraitant1.compareTo(sousTraitant2) != 0) {
     
                return sousTraitant1.compareTo(sousTraitant2) >0 ? 1:-1;
     
            } else {
     
                if (dateDebut1.compareTo(dateDebut2) !=0 ){
     
                    return dateDebut1.compareTo(dateDebut2)>0 ? 1: -1;
     
                }else {
     
                    return dateFin1.compareTo(dateFin2)>0 ? 1:-1;
     
               }
     
            }

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ouaip, mais personnellement, je stockerais le résultat de compareTo() dans un int, plutôt que l'appeler deux fois de suite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/01/2012, 17h07
  2. [Requête] Tri via une liste déroulante
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2006, 18h16
  3. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  4. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 14h55
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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