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
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.

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
Merçi pour ta réponse mais je dois utiliser absolument une collection.
La methode retourne obligatoirement une collection au choix.
1
Pierre1310 Messages postés 8554 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 645
14 avril 2016 à 14:13
Tu peux utiliser une copie de cette collection alors comme ça 2 hascode différents.
0
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:15
tu peux etre plus précis? comment je redefinis 2 fois hashcode ?dans la meme classe?
0
Pierre1310 Messages postés 8554 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 645
14 avril 2016 à 14:19
En fait ce ne sera pas la même classe, tu définis une variable qui va hériter de cette classe donc tu aura ta classe par exemple "Entité"' puis tu aura 2 classes qui seront "fille1" et "fille2".
Tu peux modifier le Hascode de fille1 sans que ça touche à celui de fille2
0
Pierre1310 Messages postés 8554 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 645
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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é)

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);
}
0
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
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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.
0
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
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 ??
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 avril 2016 à 21:47
Il ne peux y avoir qu'une seule méthode
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
equalsIgnoreCase
qui 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).
0
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
ce que je voulais dire c'est qu'a l'intérieure de la méthode equals, je fais des if
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??
0