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 :

[Treeset] [Comparator]


Sujet :

Collection et Stream Java

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Par défaut [Treeset] [Comparator]
    Bonjour,

    j ai un probleme lors de l utilsation de mon treeset.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TreeSet treeSet = new TreeSet(new CandidatInscritParScoreHarmonisationComparator());	
    		treeSet.addAll(dEtape.getCandidatsInscritEtape()); 
     
    		//Recuperation de l'iterateur
    		iter = treeSet.iterator();
    dEtape.getCandidatsInscritsEtape() retourne un set de 20 candidatsInscritsEtape
    mais lorsque j itere, il ne me ressort que 11candidats
    Le probleme vient qu il y a des candidats ex -aequo (au sens de mon comparateur)


    mon comparateur est defint comme suit, il gere les ex - eaquo

    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
     
     
    public class CandidatInscritParScoreHarmonisationComparator implements Comparator
    {
     
        /**
         *
         */
     
        public int compare(Object arg0, Object arg1)
        {
            CandidatInscritEtape c0 = (CandidatInscritEtape) arg0;
            CandidatInscritEtape c1 = (CandidatInscritEtape) arg1;
     
          double d = c1.getScoreApresEtapeHarmonisation() - c2.getScoreApresEtapeHarmonisation();
     
            if (d < 0) return +1;
            if (d > 0) return -1;
            if (d == 0)
            {
                double[] scorePondere1 = c1.calculerScoreParPonderationHarmonisation(); 
                double[] scorePondere2 = c2.calculerScoreParPonderationHarmonisation();
     
                // on compare les notes pondérées, par prédominance. 
                for ( int i = 1; i < 5; i++ ) 
                {
                    if (scorePondere1[i] - scorePondere2[2] < 0) return +1;
                    if (scorePondere1[i] - scorePondere2[2] > 0) return -1;
                }
            }
            return 0;
        }     
     
            }
     
     
     
    }

    Je sais que c est un peu obscur mais il me samble avoir traiter les ex - eaquo avec le

    Des idees?

    le treeset est il compatible avec des ex - eaquo?

    dois je chercher dans une autre direction

    merci d avance

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Et le gagnant de notre grand concours "C'est ma classe qui a le nom le plus long" est .. (roulement de tambour) ... gatwps
    Qui etait deja notre precedent gagnant du pseudo le plus imprononcable

    Plus serieusement: As tu redefinis la methode equals, parce que si les ex-aequos sont aussi equals, il y a des chances pour que le TreeSet considere que les objets sont identiques et il ne le rajoute pas..

    Si c'est pas ca tu peux toujours essaye d'utiliser un autre parametre dans ton compare pour differencier les ex-aequos (le nom du candidat par exemple)

    Si ca ne marche toujours pas montre nous la classe CandidatInscritEtape, ca pourra peut-etre nous eclairer ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Par défaut
    voili voilou la methode equals de CandidatInscritEtape

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public boolean equals(Object other)
        {
            if (!(other instanceof CandidatInscritEtape)) return false;
            CandidatInscritEtape castOther = (CandidatInscritEtape) other;
            return new EqualsBuilder().append(this.getID(), castOther.getID()).isEquals();
        }
    tu penses que le comparator delegue son tri en cas d egalite a la methode equals ???
    dans ce cas mes ID sont uniques, d ou pb encore plus insoluble puisque pas d egalite possible



    LePseudoImprononcableAuNomDeClasseInterminable

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Dans la javadoc il est dit que la methode equals doit etre consistente avec compareTo..

    En fait le TreeSet n'utilise que la methode du comparateur pour trier, si le comparateur retourne 0 pour lui les objets sont identiques et il n'ajoute pas le nouvel objet ..

    Si tu as des ID uniques tu pourrais les utiliser dans ton comparator pour retourner une valeur differente de zero en cas d'ex-aequo. Tu les classeraient par ID croissant en cas d'egalite ..

    C'est une bonne solution qui respecte la logique de la methode du comparator ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Par défaut
    bref un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return c1.getId() - c2-getId();
    a la place de


    Gatwps

  6. #6
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Yep c'est ce qu'il y a de plus simple et c'est symetrique donc pas de prob le tout reste consistent ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Par défaut
    ok merci comme ca passe,


    on m a conseille aussi de passer par une liste ce qui permet de conserver les ex eaquo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList arrayList = new ArrayList(dEtape.getCandidatsInscritEtape());
    			Collections.sort(arrayList, new CandidatInscritParScoreHarmonisationComparator());	
     
    	//Recuperation de l'iterateur
    		iter = arrayList.iterator();

    Les deux methodes tournent merci

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

Discussions similaires

  1. TreeSet avec Comparator
    Par riderfun dans le forum Collection et Stream
    Réponses: 0
    Dernier message: 31/03/2009, 16h13
  2. [date] Comparer deux formats différents
    Par terziann dans le forum Requêtes
    Réponses: 17
    Dernier message: 21/07/2003, 15h21
  3. [LG][FAQ]comparer des fichiers
    Par lucke dans le forum Langage
    Réponses: 11
    Dernier message: 01/06/2003, 18h02
  4. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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