Comparateur avec TreeSet java

Fermé
ahmadou_20 - Modifié par ahmadou_20 le 1/09/2014 à 17:37
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 1 sept. 2014 à 21:09
Bonjour,

J ai cree une classe Test pour laquelle j ai defini un comparatuer :


public class Test implements Comparable<Test > {


private Float number;

private Integer weight;

private String category;

public Test() {

}

public Test(float number, int weight, float ratio, String category) {

this.number= number;
this.weight = weight;
this.category = category;

}

public int compareTo(test compareTest) {

if(this.number!= compareTest.number) {
return this.number.compareTo(compareTest.number);
}
else if(this.weight!= compareTest.weight) {
return this.weight.compareTo(compareTest.weight);
}
else if(this.category != compareTest.category) {
return this.category.compareTo(compareTest.category);
}
else {
return 0;
}
}

public static Comparator<Test> comparator = new Comparator<Test>() {

public int compare(Test test1,
Test test2) {

return test1.compareTo(test2);
}

};

}


En gros, j aimerais stocker dans un TreeSet differents objets Test tries par ordre ascendant suivant number, weight (si number est le meme pour deux objets) ou category (si number et weight sont les memes pour deux objets).

Le probleme c est que etant donne ce code,


TreeSet<Test> tree= new TreeSet<Test>(Test.comparator);

Test t1 = new Test(2f, 12,"1");
Test t2 = new Test(3f, 11, "2");
Test t3= new Test(4f, 10, "3");

tree.add(t1);
tree.add(t2);
tree.add(t3);



je m attendrais a tree contenant [t1, t2, t3] alors que je n obtiens dans tree que t1.
Je comprends pas pourquoi bien que les trois objets sont tous differents et donc ne s excluent pas dans le TreeSet.


Qu en pensez vous ?

Merci de votre aide ?
A voir également:

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 1/09/2014 à 21:34
Bonsoir,

Plusieurs choses :

1)
public Test(float number, int weight, float ratio, String category)

Le "float ratio" n'est jamais utilisé, tu devrais l'enlever.

2)
public int compareTo(test compareTest)

Le type de compareTest devrait être "Test" (avec un T majuscule), pas "test".
Je te conseilles de mettre une annotation @Override pour voir ce genre d'erreur :
@Override
public int compareTo(Test compareTest)

3)
if (this.category != compareTest.category)

Attention, "category" est un String et doit être testé avec la méthode equals !

4) Une fois ces erreurs corrigés ton code marche très bien... alors où est vraiment ton problème ?

5) Je te conseilles d'utiliser plutôt une structure de code comme ceci, plus simple à lire et qui évite de comparer plusieurs fois la même chose (une fois dans le test du if et une autre fois dans le compare)

@Override
public int compareTo(Test compareTest)
{
    int comp;
    
    comp = Float.compare(number, compareTest.number);
    if (comp != 0)
        return comp;
    
    comp = Integer.compare(weight, compareTest.weight);
    if (comp != 0)
        return comp;
    
    comp = category.compareTo(compareTest.category);
    if (comp != 0)
        return comp;
    
    return 0;
}

6) Comme tout objet peut potentiellement être null il faut faire très attention en les manipulant. Ici par exemple rien ne t'empêcherait d'avoir "category==null" ce qui va faire un NullPointerException sur le compareTo. Pour cela je te conseilles une petite méthode de comparaison "universelle" pour traiter le cas null, il faut juste préciser si null est censé être plus petit ou plus grand qu'une valeur non nulle.

public static <E extends Comparable<E>> int compareWithNull(E e1, E e2, boolean nullIsLess)
{
    if (e1==e2)
        return 0;
    
    if (e1==null)
        return nullIsLess ? -1 : +1;
    
    if (e2==null)
        return nullIsLess ? +1 : -1;
    
    return e1.compareTo(e2);
}

Ainsi au lieu d'avoir
comp = category.compareTo(compareTest.category);
on aurait
comp = compareWithNull(category, compareTest.category, true);

La confiance n'exclut pas le contrôle
0