Comparable

Fermé
helloworld95 - 1 oct. 2018 à 23:28
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 3 oct. 2018 à 19:35
Bonjour,

J'essaye de savoir si un element ce trouve dans mon SortedSet.

je fais donc

if (set.contains(element)) return true;


Cette ligne me donne une ClassCastException. Est ce possible qu'il faille implémenter comparable ? Je ne comprend pas très bien le principe de cette interface mais j'ai cru comprendre quelle avait de l'importance.

Merci



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
2 oct. 2018 à 08:58
Bonjour,

D'une manière ou d'une autre, pour ranger les éléments "dans l'ordre" (ce qui peut être très subjectif selon les objets que tu manipules), Java doit savoir comment comparer deux objets pour déterminer lequel des deux est le plus petit.

Il y a deux manière de faire :
  • Les objets manipulés implémentent l'interface Comparable qui définit l'ordre que tu souhaites avoir ton Set
  • Ou tu passes au constructeur de ton SortedSet un Comparator pour déterminer un ordre, soit parce que les objets n'implémentent pas Comparable, soit parce que l'ordre du Comparable n'est pas celui attendu.


Remarque : depuis Java 8 on pourra s'aider des méthodes Comparator.comparing (& co) qui construisent des comparateurs à la volée.
0
helloworld95
3 oct. 2018 à 18:13
D'accord, comment savoir si les objets implémentes comparable ? On doit le faire nous même ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > helloworld95
3 oct. 2018 à 18:27
Si c'est une classe standard c'est une information qui apparaît dans la documentation.

Exemple : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

Si c'est une classe à toi, il faut explicitement implémenter l'interface Comparable et sa méthode compareTo.

Remarque : ça c'est dans le cas où tu utilises Comparable (première manière de faire), mais si tu utilises un Comparator (deuxième manière de faire) tu n'as pas besoin de modifier les classes des objets.

Dynamiquement tu peux savoir si un objet est Comparable en utilisant instanceof

if (myObj instanceOf Comparable) {
    int result = ((Comparable) myObj).compareTo(anotherObj);
}
0
helloworld95
3 oct. 2018 à 18:34
D'accord, mais equals dans tous ca ? J'ai toujours réussi à comparer deux objets avec (en rédéfinissant biensur).
Quelle est la différence ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > helloworld95
3 oct. 2018 à 19:35
Comparer ça veut dire savoir si un objet est plus petit ou plus grand que l'autre.

Si tu as deux String "a" et "b", equals va te dire qu'ils sont différents, mais tu ne sauras pas que "a" est plus petit que "b" ce que sauras me dire la méthode compareTo

Remarque : si on veut changer l'ordre, du plus grand au petit, il faudra utiliser un Comparator qui dira que "b" est plus petit que "a".

Regarde la documentation de Comparable, il y est expliqué la relation qu'il y a entre Comparable et equals.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Comparable.html
0