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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[java] Les Set se basent sur quoi pour comparer ?

n°760806
benou
Posté le 11-06-2004 à 20:20:47  profilanswer
 

Reprise du message précédent :
oui.  
 
 
Mais bon, comme on te l'as déjà dit, c'est pas top de redéfinir le equals pour des raisons de faciliter. Redéfinir equals, ca doit vraiment avoir un sens pour ton objet.


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 11-06-2004 à 20:20:47  profilanswer
 

n°761281
xiluoc
un pc pour les unirs ....
Posté le 12-06-2004 à 15:27:05  profilanswer
 

Code :
  1. public class Car implements Comparable {
  2. ...
  3. public int compareTo(Object o) {
  4. //return 0 if equal
  5. //-1 id smaller
  6. //1 if greater  
  7. //comence pas un InstanceOf histoir de voir si cest le bonne //objet puis si c une ref de 0 puis tout les params.
  8. ...
  9. }

n°761293
benou
Posté le 12-06-2004 à 16:39:55  profilanswer
 

xiluoc a écrit :

//comence pas un InstanceOf histoir de voir si cest le bonne //objet puis si c une ref de 0


 :heink:  
 
logiquement on ne compare que des objets entre eux => le instanceOf ne sers à rien, ensuite, ca n'a pas de sens de comparer un objet avec rien (c'est à dire null), donc ca sery à rien de tester l'égalité du paramêtre avec null.
 
ensuite, comme je l'ai déjà dit, compareTo a rarement du sens sur un objet. L'exemple de l'objet Car est un bon contre-exemple. Dans ces cas là, il est très préférable d'utiliser une classe Comparator à côté.

n°761319
xiluoc
un pc pour les unirs ....
Posté le 12-06-2004 à 17:36:21  profilanswer
 

benou a écrit :

:heink:  
 
logiquement on ne compare que des objets entre eux => le instanceOf ne sers à rien, ensuite, ca n'a pas de sens de comparer un objet avec rien (c'est à dire null), donc ca sery à rien de tester l'égalité du paramêtre avec null.
 
ensuite, comme je l'ai déjà dit, compareTo a rarement du sens sur un objet. L'exemple de l'objet Car est un bon contre-exemple. Dans ces cas là, il est très préférable d'utiliser une classe Comparator à côté.


Pourquoi difficile ?

Code :
  1. import java.util.Comparator;
  2. public class Car implements Comparable {
  3.   public Car(String model, int year, String manufacture, String color, int horsePower, int numberOfCylinder) {
  4.     this.model=model;
  5.     this.manufacture=manufacture;
  6.     this.year=year;
  7.     this.color=color;
  8.     this.horsePower=horsePower;
  9.     this.numberOfCylinder=numberOfCylinder;
  10.   }
  11.   public String getModel() {
  12.     return model;
  13.   }
  14.   public int getYear() {
  15.     return year;
  16.   }
  17.   public String getManufacutre() {
  18.     return manufacture;
  19.   }
  20.   public String getColor() {
  21.     return color;
  22.   }
  23.   public int getHorsePower() {
  24.     return horsePower;
  25.   }
  26.   public int getNumberOfCylinder() {
  27.     return numberOfCylinder;
  28.   }
  29.   public void setModel(String model) {
  30.     this.model=model;
  31.   }
  32.   public void setYear(int year) {
  33.     this.year=year;
  34.   }
  35.   public void setManufacture(String Manufacture) {
  36.     this.manufacture=manufacture;
  37.   }
  38.   public void setColor(String color) {
  39.     this.color=color;
  40.   }
  41.   public void setHorsePower(int HorsePower) {
  42.     this.horsePower=horsePower;
  43.   }
  44.   public void setNumberOfCylinder(int numberOfCylinder) {
  45.     this.numberOfCylinder=numberOfCylinder;
  46.   }
  47.   public String toString() {
  48.     return manufacture+" "+model+" "+year;
  49.   }
  50.   public int compareTo(Object o) {
  51.     if (o instanceof Car) {
  52.       Car obj=(Car) o;
  53.       if (stringCompare(manufacture, obj.manufacture)<0) {
  54.         return -1;
  55.       }
  56.       if (stringCompare(manufacture, obj.manufacture)>0) {
  57.         return 1;
  58.       }
  59.       if (stringCompare(model, obj.model)<0) {
  60.         return -1;
  61.       }
  62.       if (stringCompare(model, obj.model)>0) {
  63.         return 1;
  64.       }
  65.       if (year<obj.year) {
  66.         return -1;
  67.       }
  68.       if (year>obj.year) {
  69.         return 1;
  70.       }
  71.       return 0;
  72.     }
  73.     return -1;
  74.   }
  75.   protected static int stringCompare(String s1, String s2) {
  76.     int length;
  77.     if (s1.length()>s2.length()) {
  78.       length=s2.length();
  79.     }
  80.     else {
  81.       length=s1.length();
  82.     }
  83.     for (int i=0; i<length; i++) {
  84.       if (s1.charAt(i)<s2.charAt(i)) {
  85.         return -1;
  86.       }
  87.       if (s1.charAt(i)>s2.charAt(i)) {
  88.         return 1;
  89.       }
  90.     }
  91.     if (s1.length()<s2.length()) {
  92.       return -1;
  93.     }
  94.     if (s1.length()>s2.length()) {
  95.       return 1;
  96.     }
  97.     return 0;
  98.   }
  99.   protected String model;
  100.   protected int year;
  101.   protected String manufacture;
  102.   protected String color;
  103.   protected int horsePower;
  104.   protected int numberOfCylinder;
  105. }

n°761445
benou
Posté le 12-06-2004 à 22:09:22  profilanswer
 

xiluoc a écrit :

Pourquoi difficile ?


j'ai jamais dis que c'était difficile, j'ai dit que ca avait rarement du sens.
 
Est ce que tu penses qu'il n'y a qu'une façon de comparer 2 voitures ?
Si la réponse est non, les voitures ne devraient pas être comparable ...
 
et encore une fois, ton instanceOf ne sert à rien ...
 
et puis pas besoinde recoder la comparaison de chaine, hein ! s1.compareTo(s2) ca fonctionne ...

n°761449
the real m​oins moins
Posté le 12-06-2004 à 22:11:51  profilanswer
 

benou >> ton explication de l'utilisation de comparable (une seule façon de comparer x) n'est pas tout à fait juste: pour ma part j'implemente Comparable quand je veux que mes objets soient triés d'une manière spécifique (du genre quand ils ont un attribut temporel)... bien souvent le nom Sortable serait plus approprié je trouve ;)  même si Comparable est plus correct puisque l'interface est utilisée pour comparer deux objets entre eux


Message édité par the real moins moins le 12-06-2004 à 22:12:19

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761452
benou
Posté le 12-06-2004 à 22:17:47  profilanswer
 

the real moins moins a écrit :

benou >> ton explication de l'utilisation de comparable (une seule façon de comparer x) n'est pas tout à fait juste: pour ma part j'implemente Comparable quand je veux que mes objets soient triés d'une manière spécifique (du genre quand ils ont un attribut temporel)... bien souvent le nom Sortable serait plus approprié je trouve ;)  même si Comparable est plus correct puisque l'interface est utilisée pour comparer deux objets entre eux


je vois pas en quoi le fait que tu fasses un truc fait que mon explication est pas juste ... argumente parce que là je vois pas ...
 
Moi, ce que je dis c'est qu'on a pas à rendre un objet Comparable juste parce que à un moment on a besoin de le trier d'une certaine façon. C'est dénaturer l'objet. Ca revient à mettre du code dans l'objet pour une utilisation spécifique de cet objet.
 
PS : Sortable c'est l'utilisation qu'on en fait. Comparable c'est le comportement que l'ont donne à l'objet


Message édité par benou le 12-06-2004 à 22:18:48
n°761456
nraynaud
lol
Posté le 12-06-2004 à 22:19:49  profilanswer
 

benou a écrit :


Est ce que tu penses qu'il n'y a qu'une façon de comparer 2 voitures ?

oui, tu peux les trier par leur puissance d'éclairage du sol, la taille de l'aileron ou la longueur de ce que le proprio a dans le pantalon.


---------------
trainoo.com, c'est fini
n°761457
benou
Posté le 12-06-2004 à 22:21:13  profilanswer
 

nraynaud a écrit :

oui, tu peux les trier par leur puissance d'éclairage du sol, la taille de l'aileron ou la longueur de ce que le proprio a dans le pantalon.


reste sérieux :o y en a plein qui font n'importe quoi avec cette interface Comparable [:sisicaivrai]

n°761460
the real m​oins moins
Posté le 12-06-2004 à 22:24:11  profilanswer
 

benou a écrit :

je vois pas en quoi le fait que tu fasses un truc fait que mon explication est pas juste ... argumente parce que là je vois pas ...
 

toujours sur la défensive hein !
 
ce que je te dis c'est que ton explication "y a t'il une seule façon de *comparer* un objet? si oui alors Comparable, sinon non", n'est pas complete à mon avis, puisque dans 99.99% des cas un objet sera effectivement comparable par des tas de critères mais devra etre systematiquement trié d'une certaine manière.
enfin cela dit c'est vrai que je suis assez pour l'extraction de la logique de comparaison/tri en dehors de l'objet.. mais ça peut etre pratique/simple/rapide d'avoir implémenté comparable :o
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le 12-06-2004 à 22:24:11  profilanswer
 

n°761463
nraynaud
lol
Posté le 12-06-2004 à 22:26:17  profilanswer
 

benou a écrit :

reste sérieux :o y en a plein qui font n'importe quoi avec cette interface Comparable [:sisicaivrai]

y'en a encore plus qui font n'importe quoi avec leur voiture [:sisicaivrai]


---------------
trainoo.com, c'est fini
n°761536
benou
Posté le 13-06-2004 à 00:05:26  profilanswer
 

the real moins moins a écrit :

toujours sur la défensive hein !


ben non mais relis ton post : a par dire que toi tu fais d'une certaine façon, tu dis rien d'autre [:spamafote] On en a déjà discuté et j'ai jamais compris pkoi tu continuais à vouloir faire des Comparable (sachant que je ne prends pas l'argument du "c'est plus rapide à coder" )

n°761537
the real m​oins moins
Posté le 13-06-2004 à 00:06:36  profilanswer
 

bon, donne moi un bon cas d'application du Comparable alors ?
(pour moi le bon et probablement le seul cas ou je l'utilise c'est quand j'ai une liste d'element dont un des attributs est une date...)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761546
benou
Posté le 13-06-2004 à 00:14:01  profilanswer
 

j'ai pas compris le cas dont tu parles avec la date ...
 
Sinon des exemples ... je sais pas : c'est plus un politique généraliste à appliquer : pour moi prendre la décision qu'un objet implémente une nouvelle interface ca se fait pas comme ca quoi ... juste parce que à un moment t'as besoin de faire un tri.
 
Exemple de cas : tu implémente CompareTo et tu l'objet dans un Set. Si tu utilises un TreeSet ou HashSet ca n'aura pas le même comportement. A moins que du redéfinisse hashCode (et equals ...). Donc en gros, quand tu rend ton objet Comparable, pour ne pas risquer de gros bug louches plus tard, y a intérêt à coder aussi equals et hashCode. C'est pas vraiment un gain de temps par rapport à écrire une sous classe Comparable ...
 
Autre cas : un coup tu veux trier ta liste dans l'ordre croissant, l'autre coup dans l'ordre décroissant ...
 
après y a le cas où tu as plusieurs façon de trier le même objet ...
 
Donc ca fait tout un tas de bonnes raison pour ne pas céder à la fausse facilité


Message édité par benou le 13-06-2004 à 00:17:16
n°761554
the real m​oins moins
Posté le 13-06-2004 à 00:21:17  profilanswer
 

l'exemple avec la date.. ben un bete objet qui reprend un historique qqconque d'evenement qui sont arrivés à un autre objet (du genre un objet qui aurait 3 attributs: timestamp, lieu, état; l'historique du suivi d'un colis dhl par exemple)
pour ce type d'objet, leur ordre naturel est bien l'ordre croissant par le timestamp non? donc ça me semble correct qu'ils implementent comparable.
et ne me fait pas dire ce que je n'ai pas dit... je ne decide pas que "objet implémente une nouvelle interface juste parce que à un moment j'ai besoin de faire un tri"..  
 
Il s'agit bien de l'ordre naturel de ces objets.  
(String implemente Comparable ;) )
 
Si j'ai besoin de les trier spécifiquement, alors c'est clair je passe par des Comparator !
donc, toi tu aurais un exemple concret que tu consideres plus valide?


Message édité par the real moins moins le 13-06-2004 à 00:21:52

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761557
nraynaud
lol
Posté le 13-06-2004 à 00:22:53  profilanswer
 

-- > perso, j'ai compris ce que tu viens de dire (et je le note dans un coin de ma tête, merci).
 
 
benou > toutes les conneries de cohérence equals/comparable sont déjà marquées dans la javadoc.


---------------
trainoo.com, c'est fini
n°761559
benou
Posté le 13-06-2004 à 00:25:07  profilanswer
 

the real moins moins a écrit :


(String implemente Comparable ;) )


ouais d'ailleur c'est vraiment limite !!!!
 

the real moins moins a écrit :


donc, toi tu aurais un exemple concret que tu consideres plus valide?


ok, en relisant j'ai compris.
 
Un bon cas d'utilisation, comme je l'ai déjà dit, c'est les cas où il existe un ordre naturel. Le cas des évenements est un assez bon exemple ... enfin là j'y voit pas de mal ...


Message édité par benou le 13-06-2004 à 00:28:01
n°761562
the real m​oins moins
Posté le 13-06-2004 à 00:27:29  profilanswer
 

benou a écrit :

ouais d'ailleur c'est vraiment limite !!!!
 
 
hein ?

je te demande si tu as un exemple concret d'implementation de Comparable que tu considererais comme valide ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761564
benou
Posté le 13-06-2004 à 00:30:12  profilanswer
 

the real moins moins a écrit :

je te demande si tu as un exemple concret d'implementation de Comparable que tu considererais comme valide ?


j'ai édité ...
 
pas évident de trouver des bons exemples ... tout ce qui se rapproche d'un numérique ...

n°761567
the real m​oins moins
Posté le 13-06-2004 à 00:31:01  profilanswer
 

j'ajouterais, à propos de la "fausse facilité" dont parle benou que je n'implemente pas Comparable par facilité pour trier mes trucs, mais que par contre par "facilité", je vais utiliser un TreeSet pour les stocker si je sais que j'aurai besoin de les afficher dans un ordre stable.
d'ailleurs voilà, à mon avis c'est correct d'implementer Comparable dès que tu sais qu'une liste de composée d'instance ton objet devra avoir un ordre fixe.
si l'utilisateur à besoin de tris differents, il implemente ou je lui fournis des Comparator.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761570
the real m​oins moins
Posté le 13-06-2004 à 00:32:05  profilanswer
 

benou a écrit :


Un bon cas d'utilisation, comme je l'ai déjà dit, c'est les cas où il existe un ordre naturel. Le cas des évenements est un assez bon exemple ... enfin là j'y voit pas de mal ...

ha ben voilà :o
 
c'est clair que les voitures... [:ddr555]
(par contre CarCategory pourrait implementer Comparable ;) - suivant la marque la comparaison sera fait sur la categorie de prix ou le nombre de places :D)


Message édité par the real moins moins le 13-06-2004 à 00:32:33

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761573
benou
Posté le 13-06-2004 à 00:35:26  profilanswer
 

the real moins moins a écrit :

j'ajouterais, à propos de la "fausse facilité" dont parle benou que je n'implemente pas Comparable par facilité pour trier mes trucs, mais que par contre par "facilité", je vais utiliser un TreeSet pour les stocker si je sais que j'aurai besoin de les afficher dans un ordre stable.
d'ailleurs voilà, à mon avis c'est correct d'implementer Comparable dès que tu sais qu'une liste de composée d'instance ton objet devra avoir un ordre fixe.
si l'utilisateur à besoin de tris differents, il implemente ou je lui fournis des Comparator.


 :heink:  
hein ? [:dawa]

n°761579
the real m​oins moins
Posté le 13-06-2004 à 00:38:25  profilanswer
 

euh, constant [:dawa]


Message édité par the real moins moins le 13-06-2004 à 00:38:34

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761580
benou
Posté le 13-06-2004 à 00:38:55  profilanswer
 


hein ? [:dawa] encore :)

n°761586
the real m​oins moins
Posté le 13-06-2004 à 00:42:48  profilanswer
 

euh, toujours le même? garanti ?


Message édité par the real moins moins le 13-06-2004 à 00:42:56

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761591
benou
Posté le 13-06-2004 à 00:44:22  profilanswer
 

the real moins moins a écrit :

euh, toujours le même? garanti ?


Dans quel cas ca change un ordre ?
tu veux dire qu'il peut y en avoir plusieurs ?
 
 
 
(dur à comprendre un belge :o)

n°761599
the real m​oins moins
Posté le 13-06-2004 à 00:51:16  profilanswer
 

l'ordre d'iteration d'un HashSet n'est pas garanti :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761604
nraynaud
lol
Posté le 13-06-2004 à 00:54:16  profilanswer
 

c'est fini les enfants ?
 
il existe quasiment pas de formalise mathématique pour désigner un objet muable de toutes façon alors vous prenez pas la tête sur les mots.


---------------
trainoo.com, c'est fini
n°761616
xiluoc
un pc pour les unirs ....
Posté le 13-06-2004 à 01:12:17  profilanswer
 

pourquoi instance of ne sert a rien ?

n°761617
benou
Posté le 13-06-2004 à 01:13:31  profilanswer
 

the real moins moins a écrit :

l'ordre d'iteration d'un HashSet n'est pas garanti :o


ok j'ai compris [:dawa]
 
mais je suis pas d'accord [:ddr555]

n°761618
benou
Posté le 13-06-2004 à 01:14:14  profilanswer
 

xiluoc a écrit :

pourquoi instance of ne sert a rien ?


parce que en java comme en math, on compare pas des carottes et des navets [:spamafote]

n°761619
the real m​oins moins
Posté le 13-06-2004 à 01:14:43  profilanswer
 

benou a écrit :

ok j'ai compris [:dawa]
 
mais je suis pas d'accord [:ddr555]

t'as pas compris alors :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761620
benou
Posté le 13-06-2004 à 01:16:55  profilanswer
 

the real moins moins a écrit :

t'as pas compris alors :o


ben he suis pas d'accord avec ca :  

Citation :

à mon avis c'est correct d'implementer Comparable dès que tu sais qu'une liste de composée d'instance ton objet devra avoir un ordre


n°761622
the real m​oins moins
Posté le 13-06-2004 à 01:17:57  profilanswer
 

ben si tu laisses le mot qu'il y avait apres ordre, si.
l'ordre naturel quoi putain :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761633
xiluoc
un pc pour les unirs ....
Posté le 13-06-2004 à 02:21:06  profilanswer
 

benou a écrit :

parce que en java comme en math, on compare pas des carottes et des navets [:spamafote]


bah oui mais c est une securite imagine je suis un peu con et j essaie de trier un ArrayList contenant des objects differents  :whistle:  

n°761638
xiluoc
un pc pour les unirs ....
Posté le 13-06-2004 à 02:25:43  profilanswer
 

D apres Xiaping Jia:
User defined orders among objects can be defined using comparators. User defined orders can be used to sort collections with elements for which no natural order is defined, or to sort the elements in order differetn from the natural order of the elements.  
 
http://condor.depaul.edu/~xjia/

n°761640
the real m​oins moins
Posté le 13-06-2004 à 02:27:02  profilanswer
 

tu dois laisser remonter le ClassCastException dans ce cas :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°761661
benou
Posté le 13-06-2004 à 09:55:32  profilanswer
 

xiluoc a écrit :

bah oui mais c est une securite imagine je suis un peu con et j essaie de trier un ArrayList contenant des objects differents  :whistle:


ben vaut mieux que ca pète et que tu t'en rendes compte plustot que ca trie n'importe comment ...
 
comme dit --, tu te mangeras une ClassCast Exception et c'est très bien.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
fusionnement des fichiers excel en java[Java][Débutant] java.lang.NoClassDefFoundError : ??
[VBA/Access 2000] Comparer valeur champ d'édition avec champ table[Java] Problème de design : repercution de modifications
[java jboss] j2EE[Java-SQLServer] Appeler une procédure stockée contenant des espaces
[Java] Isoler proprement un motif dans une StringJava-Oracle et JSp besoin d'aide [RESOLU]
[J2ME] Lancement du navigateur Palm depuis JAVA[java] Vous préfixez vos variables pour en déterminer la portée?
Plus de sujets relatifs à : [java] Les Set se basent sur quoi pour comparer ?


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