Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1606 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Utilisation de Comparable et Comparator. help

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de Comparable et Comparator. help

n°703977
xiluoc
un pc pour les unirs ....
Posté le 20-04-2004 à 15:38:17  profilanswer
 

:hello: ,
je n arrive pas a crer mon propre type de comparator.
 
j ai une class Car

Code :
  1. public class Car
  2. {
  3.     protected String model;
  4.     protected int modelYear;
  5.     protected String manufacturer;
  6.     protected String color;
  7.     protected float horsePower;
  8.     protected byte numberOfCylinders;
  9.    
  10.     public Car(String model,  int modelYear, String manufacturer ,String color ,
  11.     float horsePower, byte numberOfCylinders )
  12.     {
  13.         this.model=model;
  14.         this.modelYear = modelYear;
  15.         this.manufacturer = manufacturer;
  16.         this.color = color;
  17.         this.horsePower = horsePower;
  18.         this.numberOfCylinders = numberOfCylinders;
  19.     }
  20. }


 
j aimerai que la comparaison se fasse sur c est 3 parametres L
manufacturer.
model.
model year.
 
comme cela trier un tableau de Cars me donnera celle dont le manufactuereur commence par A, puis model puis annnee ..
Audi A3 2035
Audi A3 2040
Audi A12 2156
Honda ..
ect...
 
Dans mon bouquin ils parlent de

Code :
  1. public interfcace Comparable {
  2.     public int compareTo(Object o);
  3. }


et de  

Code :
  1. public interfcace Comparator{
  2.    int compare(Object o1, Object o2);
  3. }


 
comment dois je my prendre ?
 :jap:  

mood
Publicité
Posté le 20-04-2004 à 15:38:17  profilanswer
 

n°704002
lorill
Posté le 20-04-2004 à 15:45:59  profilanswer
 

a priori t'as pas besoin de Comparator.
 
ecrit juste ta methode compareTo, et ca roule.

n°704013
xiluoc
un pc pour les unirs ....
Posté le 20-04-2004 à 15:51:44  profilanswer
 

lorill a écrit :

a priori t'as pas besoin de Comparator.
 
ecrit juste ta methode compareTo, et ca roule.


un exemple serait le bien venue stp  :sweat: , j en fais quoi de mon interface Comparable et le methode compareTo quel genre de code dois je y mettre ?

n°704024
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 15:54:38  profilanswer
 

Bin euh... tu sais comment marche une interface ? Ba tu fais public class Car implements Comparable et tu codes toi-même la méthode compareTo() [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704026
lorill
Posté le 20-04-2004 à 15:55:45  profilanswer
 

Code :
  1. class Tuture implements Comparable
  2. {
  3.   public int compareTo(Object o)
  4.   {
  5.      //tester le modele
  6.      //si == 0, modele identique, donc tester la suite
  7.      //sinon renvoyer le resultat de la comparaison de modele
  8.   }
  9. }


Message édité par lorill le 20-04-2004 à 15:55:56
n°704043
benou
Posté le 20-04-2004 à 16:04:46  profilanswer
 

lorill a écrit :

a priori t'as pas besoin de Comparator.
 
ecrit juste ta methode compareTo, et ca roule.


 :non:  
Très mauvaise idée !
 
Ne jamais implémenter Comparable par facilité : uniquement si ca a réellement un sens "universel" pour la classe en question !
 
Dans le cas où tu souhaites juste faire un tri, il faut faire une classe Comparator. La bonne idée c'est de la déclarer en inner classe static provate et de laisser une instance singleton de cette classe en public static final. Un peu à la façon de du comparator non-case sensitive de String


---------------
ma vie, mon oeuvre - HomePlayer
n°704045
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:07:38  profilanswer
 

benou a écrit :

:non:  
Très mauvaise idée !
 
Ne jamais implémenter Comparable par facilité : uniquement si ca a réellement un sens "universel" pour la classe en question !
 
Dans le cas où tu souhaites juste faire un tri, il faut faire une classe Comparator.


Ouais enfin là, s'il souhaite trier un tableau de Car, il a plutôt intérêt à implémenter Comparable pour pouvoir utiliser java.util.Arrays.sort() derrière.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704049
benou
Posté le 20-04-2004 à 16:12:12  profilanswer
 

Taiche a écrit :

Ouais enfin là, s'il souhaite trier un tableau de Car, il a plutôt intérêt à implémenter Comparable pour pouvoir utiliser java.util.Arrays.sort() derrière.


ben non, il fait comme j'ai dit et utilise java.util.Arrays.sort(Object[], java.util.Comparator)  :o


---------------
ma vie, mon oeuvre - HomePlayer
n°704052
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:14:09  profilanswer
 

Et d'ailleurs pourquoi c'est mal, d'implémenter Comparable ? :??:


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704066
benou
Posté le 20-04-2004 à 16:26:38  profilanswer
 

Taiche a écrit :

Et d'ailleurs pourquoi c'est mal, d'implémenter Comparable ? :??:


ben déjà pare que d'un point de vue design, c'est pas logique. Une voiture, c'est pas "ordonnable", ou plutot y a pas d'ordre unique et niversel pour trier les voitures. Les objets réélement suceptibles d'implémenter Comparable sont relativement rares : les numériques c'est OK, mais même String, quelque part, elle devrait pa ...
 
D'un point de vue moins extremiste, c'est juste que tu vas rencontrer des problèmes quand tu as utiliser certaines classes de l'API Collection. Par exemple, les TreeSet ou autre objet du genre ...


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 20-04-2004 à 16:26:38  profilanswer
 

n°704069
benou
Posté le 20-04-2004 à 16:29:46  profilanswer
 

remarque quand tu implémentes Comparable, tu définies un ordre, mais tu définis aussi l'égalité.  
 
Et c'est ca qui pose souvent problème ...


---------------
ma vie, mon oeuvre - HomePlayer
n°704079
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:35:36  profilanswer
 

Ba ch'ais pas, moi j'trouve pas ça si mal que ça [:spamafote] En implémentant Comparable, tu définis un ordre naturel qui permet d'effectuer un classement qui sera "humainement compréhensible" et c'est bien tout ce qu'on demande. Alors bon, aller faire des singletons avec un Comparator privé et tout le bastringue, j'trouve ça un brin lourdaud [:kiki]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704083
benou
Posté le 20-04-2004 à 16:39:48  profilanswer
 

Et si un jour il a la malheureuse envie d'avoir une liste sans doublons (un Set), et que pour ca il utilise un TreeSet, il va passer des heures à comprendre pourquoi y a plein de voitures qui ne sont pas dans son Set ...
 
edit : c'est du vécu hein ! maintenant je fais bien gaffe a ces conneries !

Message cité 1 fois
Message édité par benou le 20-04-2004 à 16:42:04

---------------
ma vie, mon oeuvre - HomePlayer
n°704087
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:43:11  profilanswer
 

Ba dans ce cas, il aura qu'à lire la doc de Comparable :

Citation :

The natural ordering for a class C is said to be consistent with equals if and only if (e1.compareTo((Object)e2) == 0) has the same boolean value as e1.equals((Object)e2) for every e1 and e2 of class C. Note that null  is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null)  returns false.
 
It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals method.


Ch'ais pas mais pour un prog qui a juste besoin de faire un Arrays.sort(), je trouve violent de partir dans des considérations de singletons privés et tout :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704096
benou
Posté le 20-04-2004 à 16:47:19  profilanswer
 

Taiche a écrit :

Ch'ais pas mais pour un prog qui a juste besoin de faire un Arrays.sort(), je trouve violent de partir dans des considérations de singletons privés et tout :o


ca a rien de compliqué  :heink: !
si il veut pas faire de singleton, qu'il fasse pas de singleton, mais il devra recréer l'objet à chaque fois [:spamafote]
 
et puis bon, c'est un conseil, hein, moi je m'en tape.  
Mais pkoi conseiller de faire un truc avec un mauvais design et succeptible d'engendrer des bug vicieux ?


---------------
ma vie, mon oeuvre - HomePlayer
n°704460
xiluoc
un pc pour les unirs ....
Posté le 21-04-2004 à 00:24:05  profilanswer
 

eh ben merci pour toutes ces reponses je vais essayer ca.

n°704499
xiluoc
un pc pour les unirs ....
Posté le 21-04-2004 à 01:31:39  profilanswer
 

Code :
  1. public int compareTo(Object o)
  2.     {
  3.           if (this.equals(o)) return 0;
  4.           return -1;
  5.     }


 
c est bon ?

n°704555
lorill
Posté le 21-04-2004 à 09:02:19  profilanswer
 

non, tu n'a pas de notion d'ordre

n°1325387
AppleII
Posté le 14-03-2006 à 19:29:56  profilanswer
 

Petite question: dois-je écrire absolument implements comprable ? Ou si je peux écrire directement ma méthode sans ça et faire une comparaison avec mes 2 strings d'instances ?
 
genre
 

Code :
  1. public int compareTo(object obj) {
  2.         int res;
  3.        
  4.         try {
  5.            
  6.                 res = CodeInventaire.compareTo(((Location)obj).obtCodeInventaire());
  7.                
  8.             }
  9.            
  10.             catch (Exception e) {
  11.                
  12.                 res = -1;
  13.                
  14.             }
  15.        
  16.         return res;
  17.        
  18.     }


 
Je gère une exception au cas ou je passe un null, et j'ait fait la même chose avec mon equals, est-ce que il y aurait moyen de faire mieux ?  [:chriscool007]

n°1325453
masklinn
í dag viðrar vel til loftárása
Posté le 14-03-2006 à 20:33:52  profilanswer
 

benou a écrit :

Et si un jour il a la malheureuse envie d'avoir une liste sans doublons (un Set), et que pour ca il utilise un TreeSet, il va passer des heures à comprendre pourquoi y a plein de voitures qui ne sont pas dans son Set ...
 
edit : c'est du vécu hein ! maintenant je fais bien gaffe a ces conneries !


[:petrus dei]
 
Explique comment  ça se passe si la comparaison est bien faite, parce que là je vois pas [:pingouino]
 
(en même temps va ptet faloir que tu m'explique l'implémentation du treeset, ça semble y être spécifique et je connais pas)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1325586
benou
Posté le 15-03-2006 à 02:15:27  profilanswer
 

TreeSet c'est juste un Set (collection sans doublon) implémentée sous forme d'arbre (=> plus petit d'un côté, plus grand de l'autre, égale on jette).
Bref, ca se sert de la comparaison.
 
Si le compareTo renvois 0, le TreeSet va considérer que les objets sont égaux => il ne va en garder qu'un. Donc si ta façon d'implémenter Comparable est faite à la légère (qu'elle ne représente pas une façon "universelle" de comparer l'objet), tu risques de perdre des objets sans comprendre pourquoi.
 
Le bon exemple c'est l'objet String : on peut se dire qu'il n'y a pas 36 façon de trier une chaine ... ben en fait si, y en a plein ! Elle ne devrait pas implémenter Comparable, sauf pour des raisons purement pratiques qui ne sont pas recevables devant un jury d'intégristes de l'objet.


---------------
ma vie, mon oeuvre - HomePlayer
n°1325588
benou
Posté le 15-03-2006 à 02:18:04  profilanswer
 

AppleII a écrit :

Petite question: dois-je écrire absolument implements comprable ?


oui

AppleII a écrit :

Je gère une exception au cas ou je passe un null, et j'ait fait la même chose avec mon equals, est-ce que il y aurait moyen de faire mieux ?  [:chriscool007]


oui. Là c'est ni'mporte quoi ton traitement d'exception. Si ta méthode reçoit une référence null, ya aucune raison qu'elle ne lance pas une NullPointerException. Pareil pour le ClassCastException si l'objet passé en paramètre n'est pas du bon type.


---------------
ma vie, mon oeuvre - HomePlayer
n°1325595
masklinn
í dag viðrar vel til loftárása
Posté le 15-03-2006 à 02:56:28  profilanswer
 

benou a écrit :

Si le compareTo renvois 0, le TreeSet va considérer que les objets sont égaux => il ne va en garder qu'un. Donc si ta façon d'implémenter Comparable est faite à la légère (qu'elle ne représente pas une façon "universelle" de comparer l'objet), tu risques de perdre des objets sans comprendre pourquoi.


En clair, si t'es incapable d'implémenter une comparaison ça nique ton set tout ce qui se base sur des comparaisons, ça me semble logique [:petrus75]

benou a écrit :

Le bon exemple c'est l'objet String : on peut se dire qu'il n'y a pas 36 façon de trier une chaine ... ben en fait si, y en a plein ! Elle ne devrait pas implémenter Comparable, sauf pour des raisons purement pratiques qui ne sont pas recevables devant un jury d'intégristes de l'objet.


Les comparaisons de string par défaut sont toujours alphabétiques, parce que c'est la comparaison de chaînes de caractères la plus utilisée, il est parfaitement logique de fournir la comparaison la plus utilisée pour l'objet en tant que comparaison par défaut [:spamafote]

Message cité 1 fois
Message édité par masklinn le 15-03-2006 à 02:57:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1326366
benou
Posté le 16-03-2006 à 00:20:32  profilanswer
 

masklinn a écrit :

En clair, si t'es incapable d'implémenter une comparaison ça nique ton set tout ce qui se base sur des comparaisons, ça me semble logique [:petrus75]


C'est pas la question d'être capable ou non. Ce que je dis c'est qu'une comparaison est souvent dépendente d'un contexte d'utilisation.
 

masklinn a écrit :

Les comparaisons de string par défaut sont toujours alphabétiques, parce que c'est la comparaison de chaînes de caractères la plus utilisée, il est parfaitement logique de fournir la comparaison la plus utilisée pour l'objet en tant que comparaison par défaut [:spamafote]


Ben non, on est pas d'accord. Dire ca c'est mélanger la nature et la fonction de l'objet.  
C'est quoi ta définition de l'ordre alphabétique ?
un 'A' c'est avant ou après un 'b' ?
et un é c'est avant ou après un e qui est avant ou après un 'ë' ?
 
Regarde la comparaison par défaut de String, et tu verras que ca ne répond pas de la même façon que toi à ces questions ...
 
Qui a raison ? qui a tort ?
Dès qu'il y a la moindre incertitude, ca veut dire que l'objet ne doit pas être Comparable, mais accompagné de Comparators

Message cité 1 fois
Message édité par benou le 16-03-2006 à 00:29:59

---------------
ma vie, mon oeuvre - HomePlayer
n°1326377
masklinn
í dag viðrar vel til loftárása
Posté le 16-03-2006 à 00:29:36  profilanswer
 

benou a écrit :

Ben non, on est pas d'accord. Dire ca c'est mélanger la nature et la fonction de l'objet.  
C'est quoi ta définition de l'ordre alphabétique ?
un 'A' c'est avant ou après un 'b' ?
et un é c'est avant ou après un e qui est avant ou après un 'ë' ?
 
Regarde la comparaison par défaut de String, et tu verras que ca ne répond pas de la même façon que toi à ces questions ...


Celle de String(Java) aucune idée, mais celles de string (Python) comme celle de String(Ruby) correspondent parfaitement à ma définition:

Code :
  1. >>> sorted(["bfoo","ëfoo","Afoo","éfoo","efoo"])
  2. ['Afoo', 'bfoo', 'efoo', '\xe9foo', '\xebfoo']


Code :
  1. >> ["bfoo","ëfoo","Afoo","éfoo","efoo"].sort
  2. => ["Afoo", "bfoo", "efoo", "\351foo", "\353foo"]


(resp. \xe9 et \351 pour "é" et \xeb et \353 pour "ë" )
 [:spamafote]
 
edit: Ah ben java me sort strictement le même ordre, donc tout va pour le mieux dans le meilleur des mondes pour autant que je sois concerné [:spamafote]


Message édité par masklinn le 16-03-2006 à 00:38:02

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1326380
benou
Posté le 16-03-2006 à 00:31:23  profilanswer
 

l'ordre alphabétique est "culturel" (dépendant de la Locale) => il n'y a pas de définition unique.
 
edit : http://java.sun.com/j2se/1.5.0/doc [...] ng.String)


Message édité par benou le 16-03-2006 à 00:32:59

---------------
ma vie, mon oeuvre - HomePlayer
n°1326390
masklinn
í dag viðrar vel til loftárása
Posté le 16-03-2006 à 00:39:13  profilanswer
 

J'ai regardé ce que donnait un Arrays.sort(String[]) en java, voir mon edit


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1326394
benou
Posté le 16-03-2006 à 00:43:01  profilanswer
 

masklinn a écrit :

J'ai regardé ce que donnait un Arrays.sort(String[]) en java, voir mon edit


[:gratgrat]
va falloir que je vérifie ça moi  :whistle:  
 
mais remarque, peut importe (cf. mon dernier post)


---------------
ma vie, mon oeuvre - HomePlayer
n°1326395
masklinn
í dag viðrar vel til loftárása
Posté le 16-03-2006 à 00:45:13  profilanswer
 

benou a écrit :

[:gratgrat]
va falloir que je vérifie ça moi  :whistle:


Code :
  1. import java.util.Arrays;
  2.  
  3. class TestSort {
  4.    public static void main(String args[]) {
  5.        String[] foo = {"bfoo","ëfoo","Afoo","éfoo","efoo"};
  6.        for(int i=0; i<foo.length; ++i)
  7.            System.out.print(foo[i]+" " );
  8.        System.out.println("" );
  9.        Arrays.sort(foo);
  10.        for(int i=0; i<foo.length; ++i)
  11.            System.out.print(foo[i]+" " );
  12.    }
  13. }


(oui c'est moche, je sais :o)
Output:

F:> javac TestSort.java
 
F:>java TestSort
bfoo &#948;foo Afoo &#920;foo efoo
Afoo bfoo efoo &#920;foo &#948;foo


&#948; = ë et &#920; = é, donc, d'où ordre identique aux deux autres :o
(avec Java5 en tout cas)
 

benou a écrit :

mais remarque, peut importe (cf. mon dernier post)


Sur un alphabet donné chuis pas sûr... à la limite on peut discuter sur la position des variantes accentuées (et autres cédilles) dans les alphabets romains par exemple, mais pas beaucoup plus [:spamafote]


Message édité par masklinn le 16-03-2006 à 00:47:22

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1326396
benou
Posté le 16-03-2006 à 00:48:35  profilanswer
 

j'étais quasi sûr que ca ne se servait que de la valeur du code unicode pour faire la comparaison ... bizare ... j'ai du mal à imaginer qu'ils aient changer ça d'une version de java à une autre :/
 
mais comme je disais, de toute façon ca DOIT dpendre de la Locale => ca ne devrait pas être Comparable (sauf à être une classe Générique : String<T extends Locale> )


Message édité par benou le 16-03-2006 à 00:49:11

---------------
ma vie, mon oeuvre - HomePlayer
n°1326430
powel42
Posté le 16-03-2006 à 02:18:44  profilanswer
 

Citation :

j aimerai que la comparaison se fasse sur c est 3 parametres L  
manufacturer.  
model.  
model year.


 
Juste par curiosité, comme il y a un tri à faire sur plusieurs attributs de la classe, comment coderiez-vous alors son problème (code) ?  


Message édité par powel42 le 16-03-2006 à 02:20:48
n°1326465
benou
Posté le 16-03-2006 à 08:51:57  profilanswer
 

en gros :  
 
si this.att1 < o.att1, return -1
si this.att1 > o.att1, return +1
si this.att2 < o.att2, return -1
si this.att2 > o.att2, return +1
...
return 0;


---------------
ma vie, mon oeuvre - HomePlayer
n°1326477
powel42
Posté le 16-03-2006 à 09:11:57  profilanswer
 

benou a écrit :

en gros :  
 
si this.att1 < o.att1, return -1
si this.att1 > o.att1, return +1
si this.att2 < o.att2, return -1
si this.att2 > o.att2, return +1
...
return 0;


 
 ;) aok très simple finalement.  

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Utilisation de Comparable et Comparator. help

 

Sujets relatifs
Primitives pour l'utilisation des listes[Résolu][Java]JavaHelp need Help :)
surcharge de fonctions dans une dll classique, help plzQuestion sur l'utilisation de de digester
Remplissage de polygônes - help!!help me !!!
[Perl] POO et utilisation d'une method dans un print ou un shell exechelp des noms de serveurs gratuit please
[help] est ce qu il existe des templates simples de sites en php?Utilisation d'un ping
Plus de sujets relatifs à : Utilisation de Comparable et Comparator. help


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR