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 :

[Collections] Redéfinir la méthode compare de l'interface Comparator.


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut [Collections] Redéfinir la méthode compare de l'interface Comparator.
    Bonjour,

    Dans un des mes programme, j utilise une TreeMap pour sotcké un objet de type Toto.
    Or j ai besoin de recuperer a des instant donné le plus petit objet Toto, donc j ai redefinie la methode compare de l interface Comparator.
    Mais ca ne marche pas .
    l erreur qui me donne est :

    Exception in thread "Thread-2" java.lang.ClassCastException:
    main.Test
    at java.util.TreeMap.compare(Unknown Source)
    at java.util.TreeMap.put(Unknown Source)
    ...


    Voici comment j ai fait :

    J ai une classe MyTreeMap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MyTreeMap extends TreeMap implementes Comparator {
     
       public MyTreeMap() {
          super();
       }
     
       public int compare(Object obj1, Object obj2) {
          Toto toto1 = (Toto) obj1;
          Toto toto2 = (Toto) obj2;
     
          // Ici je compare pour savoir si toto1 < toto2 ou toto1 > toto2 ou toto1 = toto2
          ....
       }
    }
    L exception est lance quand j utilise mon objet MyTreeMap pour ajouter un element Toto.

    Quelqu un pourrais me dire ce qu il faudrait faire pour remedier a ce probleme.

    Thx.

  2. #2
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    si tu utilises Tiger, ça c'est plus propre :

    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
     
    import java.util.*;
     
    public class MyTreeMap extends TreeMap implements Comparator<Estampille> {
     
       public MyTreeMap()
       {
          super();
       }
     
       public int compare(Estampille obj1, Estampille obj2)
       {
          ...
       }
    }

  3. #3
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Cas ou tu n'utilises pas tiger...

    Je n'ai pas trouvé l'interface Compare..

    Dans un premier temps tu pourrais faire la chose suivante :




    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
     
    public class MyTreeMap extends TreeMap implementes Compare {
     
       public MyTreeMap() {
          super();
       }
     
       public int compare(Object obj1, Object obj2) {
          System.out.println(obj1.getClass());
          System.out.println(obj2.getClass());
     
          Estampille toto1 = (Estampille) obj1;
          Estampille toto2 = (Estampille) obj2;
     
          // Ici je compare pour savoir si toto1 < toto2 ou toto1 > toto2 ou toto1 = toto2
          ....
       }
    }
    Cela devrait te permettra de connaitre le type des objets passés à la methode compare(). Mais je pense que l'utilisation de l'interface n'est pas bonne dans ton exemple

    aussi je te conseillerai d'adopter une autre stratégie :

    Tu devrais ecrire une classe qui implemente l'interface Comparator.
    cette classe implementerai la comparaison qui determine l'objet toto le plus petit.

    une fois que tu à fais cela .. il faut tu utilises la Classe java.util.Collections.
    Sur cette classe tu as une methode min(Collection col, Comparator); qui te renvoie l'objet le plus min.

    La collection doit contenir l'ensemble de tes objets toto à comparer.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class TotoComparator implementes Comparator {
     
     
       public int compare(Object obj1, Object obj2) {
          Estampille toto1 = (Estampille) obj1;
          Estampille toto2 = (Estampille) obj2;
     
          // Ici je compare pour savoir si toto1 < toto2 ou toto1 > toto2 ou toto1 = toto2
          ....
       }
    }
    La ou tu veux faire ta comparaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    .....
     
    totos <--- collection contenant tout tes instances d'objets Toto à comparer
     
    Toto totoMin = Collections.min(totos, new TotoComparator());

    J'espere que cela t'aidera, si tu as des questions ,n'hesites pas!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    c est vrai ^^ j ai pas trop l habitude d utiliser ca et c est un tort.
    Mais ca ne marche toujours pas ....

    ok fabszn j vais essayer ca tout de suite.

    MAJ : autant pour moi c est l interface Compartor.
    Je vais le modifier de ce pas.

  5. #5
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Ca ne marche pas toujours?
    Est ce que tu aurais un cas d'utilisation mettant en evidence un disfonctionnement (par curiosité )

    Aussi pour completer mon precedent poste tu peux implementer ton comparator dans une classe interne, etant donné que generalement un comparator correspond à un type d'objet particulier.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    j avoue je patoge un peu ^^.
    Mais je crois avoir trouve, il suffit juste que ma Classe Toto implements Comparable et c tout. Apres ca j peut utiliser un TreeMap normalement.

    Ca a l air de marcher. En tout cas plus d exception. J vais faire des tests now.

  7. #7
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Oui c'est une autre maniere de faire...

    Bon courage pour les tests

    Si tu as des questions n'hesites pas!

  8. #8
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut Re: Redefinir la methode compare de l interface Comparator.
    Citation Envoyé par berg
    donc j ai redefinie la methode compare de l interface Comparator.
    [mode="cours"] je t'embête juste avec la terminologie : on implémente les méthodes d'une interface, les redéfinir ca n'a pas de sens [/mode]

    Bref, il faut que ton objet implémente l'interface Comparable (http://java.sun.com/j2se/1.3/docs/api/java/lang/Comparable.html) et non pas comparator. Tu dois donc doter ton objet de la méthode compareTo(Object o) qui renvoi un entier :

    0 si tes 2 objets sont de même ordre
    <0 si l'objet courant est d'ordre inférieur
    >0 si l'objet courant est d'ordre supérieur

    Après, tous les tris fonctionnent.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    ouias j ai fait un abus de langage ^^, merci de le souligner autant ne pas prendre de mauvaise habitutes.

    Sinon j ai fait des tests ca marche !!!

    Hephaistos007 a d ailleurs confirme ^^.

    Merci a tous.

    J ai une autre question au sujet de clé dans les Map mais c est a voir dans un autre post ^^.

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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