Interface comparable, comparator
Fermé
Jadorelinfo
Messages postés
51
Date d'inscription
samedi 24 mai 2014
Statut
Membre
Dernière intervention
15 avril 2016
-
14 avril 2016 à 14:07
Jadorelinfo Messages postés 51 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 15 avril 2016 - 15 avril 2016 à 16:33
Jadorelinfo Messages postés 51 Date d'inscription samedi 24 mai 2014 Statut Membre Dernière intervention 15 avril 2016 - 15 avril 2016 à 16:33
A voir également:
- Interface comparable, comparator
- Xl comparator - Télécharger - Tableur
- Common interface 5v only - Forum TNT / Satellite / Réception
- Akamai netsession interface ✓ - Forum Réseaux sociaux
- Interface gmail - Guide
- Interface netflix - Accueil - Streaming
3 réponses
Jadorelinfo
Messages postés
51
Date d'inscription
samedi 24 mai 2014
Statut
Membre
Dernière intervention
15 avril 2016
1
14 avril 2016 à 14:11
14 avril 2016 à 14:11
Merçi pour ta réponse mais je dois utiliser absolument une collection.
La methode retourne obligatoirement une collection au choix.
La methode retourne obligatoirement une collection au choix.
Pierre1310
Messages postés
8564
Date d'inscription
lundi 21 décembre 2015
Statut
Membre
Dernière intervention
21 juillet 2020
649
14 avril 2016 à 14:08
14 avril 2016 à 14:08
Bonjour,
Tu peux aussi tout stocker dans un tableau qui comparera celui d'avant et celui insérer pour bien ordonner.
Tu peux aussi tout stocker dans un tableau qui comparera celui d'avant et celui insérer pour bien ordonner.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 avril 2016 à 14:54
14 avril 2016 à 14:54
Bonjour,
La réponse est dans le titre de ta question.
Pour avoir deux tri différents de la classe A, il te faut deux Comparator<A> différents pour ta classe.
Pseudo code d'exemple (je n'ai pas vérifié)
Éventuellement un des tris (si cela a un sens pour l'objet) peut-être implémenté avec Comparable :
La réponse est dans le titre de ta question.
Pour avoir deux tri différents de la classe A, il te faut deux Comparator<A> différents pour ta classe.
Pseudo code d'exemple (je n'ai pas vérifié)
public class A { int id1; int id2; } public class C1 implements Comparator<A> { @Override public int compare(A a1, A a2) { return a1.id1 - a2.id2; } } public class C2 implements Comparator<A> { @Override public int compare(A a1, A a2) { return a1.id2 - a2.id2; } } public class Test { Collection<A> coll = ... List<A> list = new ArrayList<>(coll); System.out.println(list); Collections.sort(list, new C1()); System.out.println(list); Collections.sort(list, new C2()); System.out.println(list); }
Éventuellement un des tris (si cela a un sens pour l'objet) peut-être implémenté avec Comparable :
public class A implements Comparable<A>{ int id1; int id2; public int compareTo(A a) { return this.id1 - a.id1; } } public class Test { Collection<A> coll = ... List<A> list = new ArrayList<>(coll); System.out.println(list); Collections.sort(list); System.out.println(list); }
Jadorelinfo
Messages postés
51
Date d'inscription
samedi 24 mai 2014
Statut
Membre
Dernière intervention
15 avril 2016
1
14 avril 2016 à 14:59
14 avril 2016 à 14:59
Merçi pour ta réponse kx
et les méthodes hashcode et equals il faut les redefinir non??
car le compilateur automatique ou je soumets mon devoir accepte le tri ou j'ai redefinis equals et hashcode.
Et le deuxieme tri ou je n'ai pas redefinis equals et hashcode(car deja redefinis une fois) n'accepte pas
et les méthodes hashcode et equals il faut les redefinir non??
car le compilateur automatique ou je soumets mon devoir accepte le tri ou j'ai redefinis equals et hashcode.
Et le deuxieme tri ou je n'ai pas redefinis equals et hashcode(car deja redefinis une fois) n'accepte pas
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 avril 2016 à 15:18
14 avril 2016 à 15:18
La comparaison est un concept indépendant de l'égalité.
Avoir x.compareTo(y)==0 ou compare(x,y)==0 indique uniquement que les deux objets ne sont ni plus grand ni plus petit l'un que l'autre sur un ou plusieurs critères choisis, ça ne veut pas dire qu'ils sont exhaustivement égaux.
Si ton validateur accepte ta solution ça ne veut pas forcément dire que c'est 100% correct, mais juste que dans le cas testé par le validateur ça fonctionne (ce qui n'est pas forcément le cas général).
Remarque : de manière générale il faut redéfinir hashCode et equals systématiquement dès lors que tu ajoutes un nouveau champs à ta classe.
Il y a aussi quelques propriétés évidentes que tu dois toujours avoir : si x.equals(y) alors y.equals(x), x.hashCode()==y.hashCode(), x.compareTo(y)==y.compareTo(x)==0 et c.compare(x,y)==c.compare(y,x)==0 pour tout c.
Avoir x.compareTo(y)==0 ou compare(x,y)==0 indique uniquement que les deux objets ne sont ni plus grand ni plus petit l'un que l'autre sur un ou plusieurs critères choisis, ça ne veut pas dire qu'ils sont exhaustivement égaux.
Si ton validateur accepte ta solution ça ne veut pas forcément dire que c'est 100% correct, mais juste que dans le cas testé par le validateur ça fonctionne (ce qui n'est pas forcément le cas général).
Remarque : de manière générale il faut redéfinir hashCode et equals systématiquement dès lors que tu ajoutes un nouveau champs à ta classe.
Il y a aussi quelques propriétés évidentes que tu dois toujours avoir : si x.equals(y) alors y.equals(x), x.hashCode()==y.hashCode(), x.compareTo(y)==y.compareTo(x)==0 et c.compare(x,y)==c.compare(y,x)==0 pour tout c.
Jadorelinfo
Messages postés
51
Date d'inscription
samedi 24 mai 2014
Statut
Membre
Dernière intervention
15 avril 2016
1
14 avril 2016 à 21:23
14 avril 2016 à 21:23
Merçi pour ta réponse kx,
J'aurais une autre question: est-ce possible de redéfinir une fois equals et hashcode et implementer differentes egalités ??
J'aurais une autre question: est-ce possible de redéfinir une fois equals et hashcode et implementer differentes egalités ??
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 avril 2016 à 21:47
14 avril 2016 à 21:47
Il ne peux y avoir qu'une seule méthode
public boolean equals(Object obj)
Mais pour les autres méthodes tu fais ce que tu veux, tu peux implémenter autant de méthodes que tu veux, y compris des méthodes d'égalité.
Par exemple dans la classe String tu as
equals(Object)et comme celle-ci sera utilisée par les algorithmes génériques (notamment dans les collections), tu dois absolument respecter son contrat tel que défini dans la classe Object :
public boolean equals(Object obj)
Mais pour les autres méthodes tu fais ce que tu veux, tu peux implémenter autant de méthodes que tu veux, y compris des méthodes d'égalité.
Par exemple dans la classe String tu as
equalsIgnoreCasequi vient dire si deux String sont égaux sans tenir compte de la différence entre lettres minuscules et majuscules (contrairement à la méthode equals qui est plus stricte).
Jadorelinfo
Messages postés
51
Date d'inscription
samedi 24 mai 2014
Statut
Membre
Dernière intervention
15 avril 2016
1
14 avril 2016 à 22:14
14 avril 2016 à 22:14
ce que je voulais dire c'est qu'a l'intérieure de la méthode equals, je fais des if
comme ceci:
et la meme chose pour hashcode??
comme ceci:
@Override
public boolean equals(Object obj){
Produit other = (Produit) obj;
if(this.identifiant==other.identifiant)
return true;
else if(this.prix==other.prix)
return true;
else if(this.nom==other.nom)
return true;
else
return false;
}
et la meme chose pour hashcode??
14 avril 2016 à 14:13
14 avril 2016 à 14:15
14 avril 2016 à 14:19
Tu peux modifier le Hascode de fille1 sans que ça touche à celui de fille2