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 :

Avertissement Eclipse sur Comparator


Sujet :

Collection et Stream Java

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut Avertissement Eclipse sur Comparator
    Bonjour,

    J'utilise des listes de données que je dois pouvoir ordonner suivant plusieurs tris. Ces tris dépendent de la liste et chaque liste peut avoir plusieurs façons d'être triées.
    J'ai donc créer une classe ComparatorDonnee qui implémente 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
    public class ComparatorDonnee implements Comparator
    {
    	@Override
    	public int compare(Object arg0, Object arg1) 
    	{
    		if (arg0 instanceof CentreCivilisationGHM) 
    			return compareCentreCivilisation((CentreCivilisationGHM) arg0,(CentreCivilisationGHM)arg1);
    		return 0;
    	}
     
    	private int compareCentreCivilisation(CentreCivilisationGHM arg0,
    						          CentreCivilisationGHM arg1) 
    	{
    		int compare = arg0.getIdCiv() - arg1.getIdCiv();
    		if (compare != 0) return compare;
    		return arg0.getIntervalle().compareTo(arg1.getIntervalle());
    	}
    Donc on teste le type de donnée et on lui applique la comparaison nécessaire.
    Lors de l'utilisation j'ai un avertissement :
    Type safety: Unchecked invocation sort(List<CentreCivilisationGHM>, ComparatorDonnee) of the generic method sort(List<T>, Comparator<? super T>) of type Collections
    sur la ligne : Collections.sort(liste, new ComparatorDonnee());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List<CentreCivilisationGHM> liste = new ArrayList<CentreCivilisationGHM>();
    liste.addAll(ConnexionBase.getListeCentresCivilisations());
    Collections.sort(liste, new ComparatorDonnee());
    Quelqu'un a une idée ?
    J'en profite pour demander s'il est nécessaire de redéfinir equal quand on implémente un comparateur ? Et si oui pourquoi ?
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par Patrice Henrio Voir le message
    Quelqu'un a une idée ?
    Tu as aussi un warning sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ComparatorDonnee implements Comparator {
    Comparator is a raw type. References to generic type Comparator<T> should be parameterized
    Le vrai problème est là. Ça devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ComparatorDonnee implements Comparator<CentreCivilisationGHM> {
    Ce qui va te dispenser de faire des instanceof et des cast.

    Citation Envoyé par Patrice Henrio Voir le message
    J'en profite pour demander s'il est nécessaire de redéfinir equal quand on implémente un comparateur ? Et si oui pourquoi ?
    Non. Par exemple si tu définis une classe Personne avec un String nom et un int age. Puis tu fais un Comparator<Personne> qui permet de classer les gens du plus jeune au plus âgé. Si deux personnes ont le même âge, le Comparator peut renvoyer zéro sans problème pour indiquer l'égalité.
    Le Personne.equals() par contre, ne devrait pas considérer que deux personnes sont pareilles si elles n'ont pas le même nom.
    Il est donc normal qu'il y ait une différence.

    Par contre, si une classe implémente Comparable, c'est différent. Sa méthode compareTo() définit alors un ordre naturel (il ne peut y en avoir qu'un, puisqu'on ne peut pas "implémenter Comparable plusieurs fois",) et si deux objets sont égaux dans cet ordre naturel, il est nécessaire qu'ils le soient aussi avec equals(). En fait equals() devrait toujours appeler return compareTo() == 0; quand on implémente Comparable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tu as aussi un warning sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ComparatorDonnee implements Comparator {


    Le vrai problème est là. Ça devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ComparatorDonnee implements Comparator<CentreCivilisationGHM> {
    Ce qui va te dispenser de faire des instanceof et des cast.
    Merci de ta réponse.
    Pour ce qui concerne Comparator, je voudrai justement utiliser un Comparator générique pour toutes les classes filles d'une classe mère (DonneeGHM). Mais ce Comparator est différent suivant la classe concernée (d'où le instanceof).
    Voici ce que cela donne avec plusieurs type d'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	@Override
    	public int compare(DonneeGHM arg0, DonneeGHM arg1) 
    	{
    		if (arg0 instanceof CentreCivilisationGHM) 
    			return compareCentreCivilisation((CentreCivilisationGHM) arg0,(CentreCivilisationGHM)arg1);
    		if (arg0 instanceof InfoTerritoireGHM)
    			return compareInfoTerritoire((InfoTerritoireGHM) arg0, (InfoTerritoireGHM) arg1);
    		if (arg0 instanceof LimesGHM)
    			return compareLimes((LimesGHM)arg0, (LimesGHM)arg1);
    		return 0;
    	}
    Tu as raison il manquait le type de Comparator, j'ai donc rajouté Comparator<DonneeGHM>. Cependant peut-être que la généricité permettrait d'améliorer ce point. Il faut que j'y travaille.
    C'est en respectant les autres que l'on se fait respecter.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    La méthode comparative est différente à chaque fois, il n'y a donc aucune raison d'avoir une seule classe Comparator<DonneeGHM>.

    Il serait plus logique, plus utile et plus simple d'avoir trois classes Comparator<CentreCivilisationGHM>, Comparator<InfoTerritoireGHM> et Comparator<LimesGHM>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par thelvin Voir le message
    La méthode comparative est différente à chaque fois, il n'y a donc aucune raison d'avoir une seule classe Comparator<DonneeGHM>.

    Il serait plus logique, plus utile et plus simple d'avoir trois classes Comparator<CentreCivilisationGHM>, Comparator<InfoTerritoireGHM> et Comparator<LimesGHM>.
    Oui en fait tu as raison. Je compliquais uniquement pour avoir des méthodes automatiques de vérification de liste. J'ai repris en créant un package de comparateurs.
    C'est en respectant les autres que l'on se fait respecter.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2007, 16h45
  2. Comment intégrer jboss sous eclipse sur mac os x
    Par spynux dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 01/02/2007, 10h34
  3. Développer en JAVA ECLIPSE sur un micro perso
    Par padraig29 dans le forum Développement Web en Java
    Réponses: 15
    Dernier message: 06/12/2006, 10h56
  4. [Install]installation eclipse sur win 98
    Par bonjovi dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/12/2004, 00h14
  5. [Linux]probleme au lancement d'eclipse sur mandrake 10
    Par Dnx dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/09/2004, 20h34

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