Utilisation de Comparable et Comparator. help

Utilisation de Comparable et Comparator. help - Java - Programmation

Marsh Posté le 20-04-2004 à 15:38:17    

: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:  

Reply

Marsh Posté le 20-04-2004 à 15:38:17   

Reply

Marsh Posté le 20-04-2004 à 15:45:59    

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

Reply

Marsh Posté le 20-04-2004 à 15:51:44    

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 ?

Reply

Marsh Posté le 20-04-2004 à 15:54:38    

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.
Reply

Marsh Posté le 20-04-2004 à 15:55:45    

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
Reply

Marsh Posté le 20-04-2004 à 16:04:46    

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
Reply

Marsh Posté le 20-04-2004 à 16:07:38    

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.
Reply

Marsh Posté le 20-04-2004 à 16:12:12    

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
Reply

Marsh Posté le 20-04-2004 à 16:14:09    

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.
Reply

Marsh Posté le 20-04-2004 à 16:26:38    

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
Reply

Marsh Posté le 20-04-2004 à 16:26:38   

Reply

Marsh Posté le 20-04-2004 à 16:29:46    

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
Reply

Marsh Posté le 20-04-2004 à 16:35:36    

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.
Reply

Marsh Posté le 20-04-2004 à 16:39:48    

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
Reply

Marsh Posté le 20-04-2004 à 16:43:11    

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.
Reply

Marsh Posté le 20-04-2004 à 16:47:19    

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
Reply

Marsh Posté le 21-04-2004 à 00:24:05    

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

Reply

Marsh Posté le 21-04-2004 à 01:31:39    

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


 
c est bon ?

Reply

Marsh Posté le 21-04-2004 à 09:02:19    

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

Reply

Marsh Posté le 14-03-2006 à 19:29:56    

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]

Reply

Marsh Posté le 14-03-2006 à 20:33:52    

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
Reply

Marsh Posté le 15-03-2006 à 02:15:27    

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
Reply

Marsh Posté le 15-03-2006 à 02:18:04    

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
Reply

Marsh Posté le 15-03-2006 à 02:56:28    

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
Reply

Marsh Posté le 16-03-2006 à 00:20:32    

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
Reply

Marsh Posté le 16-03-2006 à 00:29:36    

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
Reply

Marsh Posté le 16-03-2006 à 00:31:23    

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
Reply

Marsh Posté le 16-03-2006 à 00:39:13    

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
Reply

Marsh Posté le 16-03-2006 à 00:43:01    

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
Reply

Marsh Posté le 16-03-2006 à 00:45:13    

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
Reply

Marsh Posté le 16-03-2006 à 00:48:35    

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
Reply

Marsh Posté le 16-03-2006 à 02:18:44    

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
Reply

Marsh Posté le 16-03-2006 à 08:51:57    

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
Reply

Marsh Posté le 16-03-2006 à 09:11:57    

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.  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed