Interface comparable, comparator
Jadorelinfo
Messages postés
51
Date d'inscription
Statut
Membre
Dernière intervention
-
Jadorelinfo Messages postés 51 Date d'inscription Statut Membre Dernière intervention -
Jadorelinfo Messages postés 51 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je dois trier 2 collections dans la meme classe,l'une par prix croissant et l'autre par identifiant croissant.
J'ai utilise pour le 1er tri un objet comparable ou j'ai redéfinis equals et hashcode.Mais pour le deuxieme tri je fais comment?? vu que j'ai deja redefinis equals et hashcode??
Merçi par avance.
Je dois trier 2 collections dans la meme classe,l'une par prix croissant et l'autre par identifiant croissant.
J'ai utilise pour le 1er tri un objet comparable ou j'ai redéfinis equals et hashcode.Mais pour le deuxieme tri je fais comment?? vu que j'ai deja redefinis equals et hashcode??
Merçi par avance.
A voir également:
- Interface comparable, comparator
- Xl comparator - Télécharger - Tableur
- Common interface 5v only - Forum TNT / Satellite / Réception
- Interface netflix - Accueil - Streaming
- Interface gmail - Guide
- Akamai netsession interface ✓ - Forum Réseaux sociaux
3 réponses
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.
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.
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); }
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
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.
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).
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??
Tu peux modifier le Hascode de fille1 sans que ça touche à celui de fille2