$ java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :)
Etonnant non ?
pas vraiment :)
$ java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :)
Etonnant non ?
pas vraiment :)
$ java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :)
Etonnant non ?
pas vraiment :)
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être une
méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :) en gros si
ton Set doit cotenir toutes tes données, alors il ne faut pas ecrire un
tel comparator et l'utiliser pour trier... par contre on utilise un set
pour trier des données contenues dans une liste et là tu auras bien
inséré tes 10 elements et t'auras l'ordre semantique desire....
un petit conseil: ne pas redefinir equals() sans redefinir hashcode()
Merci du conseil !
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être une
méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :) en gros si
ton Set doit cotenir toutes tes données, alors il ne faut pas ecrire un
tel comparator et l'utiliser pour trier... par contre on utilise un set
pour trier des données contenues dans une liste et là tu auras bien
inséré tes 10 elements et t'auras l'ordre semantique desire....
un petit conseil: ne pas redefinir equals() sans redefinir hashcode()
Merci du conseil !
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être une
méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
hummm, question interessante mais certainement pas un bug :) en gros si
ton Set doit cotenir toutes tes données, alors il ne faut pas ecrire un
tel comparator et l'utiliser pour trier... par contre on utilise un set
pour trier des données contenues dans une liste et là tu auras bien
inséré tes 10 elements et t'auras l'ordre semantique desire....
un petit conseil: ne pas redefinir equals() sans redefinir hashcode()
Merci du conseil !
Ca veut dire qu'en gros, il faut une liste contenant
Mattieu 21 ans, Paul 20 ans, Jean 19 ans et Pierre 20 ans.
Ensuite, on constuit un SortedTree a partir de cette liste en passant en
paramètre une instance d'ApotreComparator qui contient notre méthode.
Aucun constructeur de TreeSet ne permet de faire ça. Comment faire alors
? Utiliser un static sort sur un tableau d'objets ?
En fait, mon but était de maintenir un ensemble trié selon un ordre et
non pas de le trier entièrement une fois de temps en temps.
Ca veut dire qu'en gros, il faut une liste contenant
Mattieu 21 ans, Paul 20 ans, Jean 19 ans et Pierre 20 ans.
Ensuite, on constuit un SortedTree a partir de cette liste en passant en
paramètre une instance d'ApotreComparator qui contient notre méthode.
Aucun constructeur de TreeSet ne permet de faire ça. Comment faire alors
? Utiliser un static sort sur un tableau d'objets ?
En fait, mon but était de maintenir un ensemble trié selon un ordre et
non pas de le trier entièrement une fois de temps en temps.
Ca veut dire qu'en gros, il faut une liste contenant
Mattieu 21 ans, Paul 20 ans, Jean 19 ans et Pierre 20 ans.
Ensuite, on constuit un SortedTree a partir de cette liste en passant en
paramètre une instance d'ApotreComparator qui contient notre méthode.
Aucun constructeur de TreeSet ne permet de faire ça. Comment faire alors
? Utiliser un static sort sur un tableau d'objets ?
En fait, mon but était de maintenir un ensemble trié selon un ordre et
non pas de le trier entièrement une fois de temps en temps.
Essaie d intitialier de cette facon : Set set = new TreeSet( new
ApotreComparator() );
Au lieu de mettre tes apotres dans une liste tu les mets directement
dans le set et l ensemble sera toujours trie. set.add( "un apotre" ); ou
set.addAll( "une collection d apotres" );
Mais tout ca c est quand meme marque dans la doc...
Essaie d intitialier de cette facon : Set set = new TreeSet( new
ApotreComparator() );
Au lieu de mettre tes apotres dans une liste tu les mets directement
dans le set et l ensemble sera toujours trie. set.add( "un apotre" ); ou
set.addAll( "une collection d apotres" );
Mais tout ca c est quand meme marque dans la doc...
Essaie d intitialier de cette facon : Set set = new TreeSet( new
ApotreComparator() );
Au lieu de mettre tes apotres dans une liste tu les mets directement
dans le set et l ensemble sera toujours trie. set.add( "un apotre" ); ou
set.addAll( "une collection d apotres" );
Mais tout ca c est quand meme marque dans la doc...
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Pour commencer un petit code:
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* @author
* on 2 déc. 2003
*/
public class SortedSetTry {
public class Item{
Integer v;
public Item(int v){
this.v = new Integer(v);
}
public Integer getV(){ return v ;}
}
protected class ItemComparator implements Comparator{
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object,
java.lang.Object) */
public int compare(Object o1, Object o2) {
Item i1 = (Item)o1;
Item i2 = (Item)o2;
// TODO Auto-generated method stub
int diff = i1.getV().compareTo(i2.getV());
if ( diff == 0 ){ diff++;}
return diff;
}
}
public static void main(String[] args) throws Exception{
SortedSetTry sst = new SortedSetTry();
SortedSet set = new TreeSet(sst.new ItemComparator());
for ( int i = 1 ; i <= 5 ; ++i){
set.add(sst.new Item(i));
}
for( int i = 5 ; i >= 1 ; --i){
set.add(sst.new Item(i));
}
Item f = (Item)set.first();
System.out.println(" First : " + f);
System.out.println(" Contains : " + set.contains(f));
System.out.println(" Remove : " + set.remove(f));
}
}
Sa sortie:
First : sandbox.SortedSetTry$
Contains : false
Remove : false
Logique. (explication plus bas).
Maintenant, si on enlève la ligne if ( diff == 0 ){ diff++;} dans
la méthode de comparaison et qu'on ajoute un
System.out.println(" Size " : set.size()); :
Size : 5
First : sandbox.SortedSetTry$
Contains : true
Remove : true
Alors qu'on pensait avoir inséré 10 items et non cinq.
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More
formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode
equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Et c'est d'ailleurs bien pratique, et nettement plus logique, non ?
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
Etonnant non ?
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Pour commencer un petit code:
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* @author jerome.eteve@it-omics.com
* on 2 déc. 2003
*/
public class SortedSetTry {
public class Item{
Integer v;
public Item(int v){
this.v = new Integer(v);
}
public Integer getV(){ return v ;}
}
protected class ItemComparator implements Comparator{
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object,
java.lang.Object) */
public int compare(Object o1, Object o2) {
Item i1 = (Item)o1;
Item i2 = (Item)o2;
// TODO Auto-generated method stub
int diff = i1.getV().compareTo(i2.getV());
if ( diff == 0 ){ diff++;}
return diff;
}
}
public static void main(String[] args) throws Exception{
SortedSetTry sst = new SortedSetTry();
SortedSet set = new TreeSet(sst.new ItemComparator());
for ( int i = 1 ; i <= 5 ; ++i){
set.add(sst.new Item(i));
}
for( int i = 5 ; i >= 1 ; --i){
set.add(sst.new Item(i));
}
Item f = (Item)set.first();
System.out.println(" First : " + f);
System.out.println(" Contains : " + set.contains(f));
System.out.println(" Remove : " + set.remove(f));
}
}
Sa sortie:
First : sandbox.SortedSetTry$Item@194df86
Contains : false
Remove : false
Logique. (explication plus bas).
Maintenant, si on enlève la ligne if ( diff == 0 ){ diff++;} dans
la méthode de comparaison et qu'on ajoute un
System.out.println(" Size " : set.size()); :
Size : 5
First : sandbox.SortedSetTry$Item@194df86
Contains : true
Remove : true
Alors qu'on pensait avoir inséré 10 items et non cinq.
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More
formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode
equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Et c'est d'ailleurs bien pratique, et nettement plus logique, non ?
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
Etonnant non ?
Salut à tous. Voici une petit discussion sur les SortedSet.
J'aimerais avoir vos avis éclairés sur le sujet.
Merci et bonne lecture !!
Pour commencer un petit code:
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* @author
* on 2 déc. 2003
*/
public class SortedSetTry {
public class Item{
Integer v;
public Item(int v){
this.v = new Integer(v);
}
public Integer getV(){ return v ;}
}
protected class ItemComparator implements Comparator{
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object,
java.lang.Object) */
public int compare(Object o1, Object o2) {
Item i1 = (Item)o1;
Item i2 = (Item)o2;
// TODO Auto-generated method stub
int diff = i1.getV().compareTo(i2.getV());
if ( diff == 0 ){ diff++;}
return diff;
}
}
public static void main(String[] args) throws Exception{
SortedSetTry sst = new SortedSetTry();
SortedSet set = new TreeSet(sst.new ItemComparator());
for ( int i = 1 ; i <= 5 ; ++i){
set.add(sst.new Item(i));
}
for( int i = 5 ; i >= 1 ; --i){
set.add(sst.new Item(i));
}
Item f = (Item)set.first();
System.out.println(" First : " + f);
System.out.println(" Contains : " + set.contains(f));
System.out.println(" Remove : " + set.remove(f));
}
}
Sa sortie:
First : sandbox.SortedSetTry$
Contains : false
Remove : false
Logique. (explication plus bas).
Maintenant, si on enlève la ligne if ( diff == 0 ){ diff++;} dans
la méthode de comparaison et qu'on ajoute un
System.out.println(" Size " : set.size()); :
Size : 5
First : sandbox.SortedSetTry$
Contains : true
Remove : true
Alors qu'on pensait avoir inséré 10 items et non cinq.
Si on regarde la doc des méthodes contains et remove d'un sorted set,
voici ce qu'on apprend:
*contains*
[=public boolean contains(Object o)]
Returns true if this set contains the specified element. More
formally,
returns true if and only if this set contains an element e such that
(o==null ? e==null : o.equals(e)).
Pareillement, la methode add et la methode remove d'un Set
(ou d'un SortedSet) sont sensée d'après la doc utiliser la méthode
equals sur les objects.
*Ces méthodes devraient selon la doc utiliser la méthode equals
sur o et non un cas particulier de la méthode compare.*
C'est pourtant ce qui arrive.
Et c'est d'ailleurs bien pratique, et nettement plus logique, non ?
Voici des implications très désagréables:
Imaginons que vous vouliez afficher des personnes triées
par age en utilisant un sortedSet (pourquoi pas, ca parait être
une méthode valable et simple).
Jean 19 ans, Pierre 20 ans, Paul 20 ans, Mattieu 21 ans.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Et bien, si vous utilisez ce comparateur, il devient impossible
d'inserer Paul après que vous ayez inséré Pierre.
Comment résoudre ce casse tête ?
Etonnant non ?
Le 03.12 2003, Jéjé s'est levé et s'est dit : "tiens, si j'écrivais aux
mecs de fr.comp.lang.java ?"
Ce serait pas à côté de Lille, ton truc ? Et ils embaucheraient pas des
développeurs java, par hasard ?
En utilisnt un comparateur plus malin : si j'avais à implémenter ce
genre de cas, je testerais tous les chaps pour lesquels la comparaison à
un sens dans un ordre de priorité. Par exemple, ici, je veux trier
d'abord par l'âge, puis par le prénom, il me semble. Et là, tu pourras
insérer Paul après avoir inséré Pierre.
Le 03.12 2003, Jéjé s'est levé et s'est dit : "tiens, si j'écrivais aux
mecs de fr.comp.lang.java ?"
Ce serait pas à côté de Lille, ton truc ? Et ils embaucheraient pas des
développeurs java, par hasard ?
En utilisnt un comparateur plus malin : si j'avais à implémenter ce
genre de cas, je testerais tous les chaps pour lesquels la comparaison à
un sens dans un ordre de priorité. Par exemple, ici, je veux trier
d'abord par l'âge, puis par le prénom, il me semble. Et là, tu pourras
insérer Paul après avoir inséré Pierre.
Le 03.12 2003, Jéjé s'est levé et s'est dit : "tiens, si j'écrivais aux
mecs de fr.comp.lang.java ?"
Ce serait pas à côté de Lille, ton truc ? Et ils embaucheraient pas des
développeurs java, par hasard ?
En utilisnt un comparateur plus malin : si j'avais à implémenter ce
genre de cas, je testerais tous les chaps pour lesquels la comparaison à
un sens dans un ordre de priorité. Par exemple, ici, je veux trier
d'abord par l'âge, puis par le prénom, il me semble. Et là, tu pourras
insérer Paul après avoir inséré Pierre.
Merci pour ces explications limpides.
J'implémente de ce pas la solution de la comparaison avec ordre de
priorité. Je crois bien que j'avais du mal avec la notion d'ordre total.
Je crois aussi.
Merci pour ces explications limpides.
J'implémente de ce pas la solution de la comparaison avec ordre de
priorité. Je crois bien que j'avais du mal avec la notion d'ordre total.
Je crois aussi.
Merci pour ces explications limpides.
J'implémente de ce pas la solution de la comparaison avec ordre de
priorité. Je crois bien que j'avais du mal avec la notion d'ordre total.
Je crois aussi.
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}
Vous implémentez en toute innocence un comparateur qui donne ceci:
compare(p1,p2) { return p2.age - p1.age ;}