Explication détaillée et différence entre Java Comparable et Comparator
Java nous fournit deux mécanismes de comparaison: comparable et comparateur. Quelle est la différence entre eux? Découvrons aujourd'hui.
Sort naturel comparable
Comparable est une interface dans le package java.lang, et il n'y a qu'une seule méthode que compareto () à l'intérieur:
interface publique comparable <T> {public int compareto (t o);}Comparable permet aux objets de la classe qui implémente de comparer. Les règles de comparaison spécifiques sont effectuées conformément aux règles de la méthode compareto. Cet ordre est appelé ordre naturel.
Il y a trois cas où la valeur de retour de la méthode compareto est:
Avis:
1. Étant donné que NULL n'est pas une classe ou un objet, vous devez prêter attention au cas d'E ..compareto (null) lors de la réécriture de la méthode de comparaison. Même si E.equals (null) renvoie False, la méthode Compareto doit lancer activement une exception de pointeur nul nullpointerException.
2. Lors de la mise en œuvre de la classe comparable pour réécrire la méthode de comparaison, le résultat de e1.compareto (e2) == 0 est généralement nécessaire pour être cohérent avec e1.equals (e2). De cette façon, à l'avenir, lors de l'utilisation de tridset et d'autres conteneurs de collecte triés en fonction du type naturel de classes, l'ordre des données enregistrées peut être assurée pour être cohérente avec l'imagination.
Certaines personnes peuvent être curieuses de ce qui se passera si le deuxième point ci-dessus est violé?
Par exemple, si vous ajoutez deux objets A et B à un sortset, AB satisfait (! A.equals (b) && a.compareto (b) == 0), et qu'il n'y a aucun autre comparateur spécifié, puis lorsque vous ajoutez A puis B, il ajoutera faux, et la taille du sort-ensemble n'augmentera pas, car dans SORDSET, ils sont les mêmes, et la duplication n'est pas autorisée dans le trieur ne augmentera pas.
En fait, les résultats de toutes les classes Java Core qui implémentent l'interface comparable sont cohérentes avec la méthode Equalas.
La liste ou les tableaux qui implémentent l'interface comparable peuvent être triés à l'aide des méthodes Collection.Sort () ou Arrays.Sort ().
Seuls les objets qui implémentent l'interface comparable peuvent être utilisés directement comme des clés de TridMap (tridSet), sinon les règles de tri du comparateur doivent être spécifiées à l'extérieur.
Par conséquent, si vous souhaitez utiliser des classes de collecte commandées pour la classe que vous définissez vous-même, vous devez implémenter l'interface comparable, telle que:
** * Description: Le livre de classe d'entité utilisé pour les tests, implémente l'interface comparable, le tri naturel * <br/> * Auteur: shixinzhang * <br/> * Données: 10/5/2016 * / classe publique BookBean implémente sérialisable, comparable {nom de chaîne privé; Count int privé; public bookBean (String Name, int count) {this.name = name; this.count = count; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public int getCount () {return count; } public void setCount (int count) {this.count = count; } / ** * réécriture égaux * @param o * @return * / @Override public boolean equals (objet o) {if (this == o) return true; if (! (o instanceof bookBean)) renvoie false; BookBean Bean = (BookBean) o; if (getCount ()! = bean.getCount ()) return false; return getName (). equals (bean.getName ()); } / ** * Réécrivez la méthode de calcul de HashCode * Calcul itérative basé sur tous les attributs pour éviter la duplication * Le facteur de calcul 31 est observé lors du calcul de HashCode. Il s'agit d'un nombre premier et ne peut pas être divisé à nouveau * @return * / @Override public int hashcode () {// call string's hashCode (), qui représente uniquement le contenu d'une chaîne int result = getName (). HashCode (); // Multipliez par 31, plus le résultat de comptage = 31 * Résultat + getCount (); Résultat de retour; } @Override public String toString () {return "bookBean {" + "name = '" + name +' / '' + ", count =" + count + '}'; } / ** * Lors de l'ajout de bookBean à Treeset, cette méthode sera appelée pour tri * @param un autre * @return * / @Override public int compareto (objet un autre) {if (une autre instanceof bookBean) {bookBean autre livre = (bookBean) un autre; Résultat int; // par exemple, tri par prix du livre ici résultat = getCount () - AnotherBook.getCount (); // ou suivre la chaîne L'ordre de comparaison // result = getName (). Compareto (ano un autre livretName ()); if (result == 0) {// Lorsque le prix du livre est le même, comparez le titre. Assurez-vous que tous les attributs sont comparés result = getName (). Compareto (ano un autre livretName ()); } Retour Résultat; } // return 0 return 0; }Le code ci-dessus a également réécrit les méthodes Equalas () et HashCode (). Les classes personnalisées doivent réécrire ces méthodes lorsqu'ils souhaitent les comparer.
Lors de la réécriture de comparaison plus tard, vous devez juger si un certain attribut est le même et comparer tous les attributs une fois.
L'interface comparable fait partie du cadre des collections Java.
Tour personnalisé du comparateur
Le comparateur est également une interface dans le package java.util. Avant JDK 1.8, il n'y avait que deux méthodes:
Public Interface Comparator <T> {public int compare (t lhs, t rhs); booléen public est égal (objet objet);}De nombreuses nouvelles méthodes ont été ajoutées à JDK 1.8:
Fondamentalement, ils sont tous liés à la fonction, et les nouveaux ajouts à 1.8 ne seront pas introduits ici.
À partir de ce qui précède, nous pouvons voir que l'utilisation du tri naturel nécessite des classes pour implémenter comparables et que la méthode Comparato est réécrite en interne.
Le comparateur définit les règles de tri à l'extérieur et les transmet à certaines classes en tant que paramètres de politique de tri, tels que Collection.Sort (), Arrays.Sort (), ou certaines collections commandées en interne (telles que tridset, tridmap, etc.).
Comment l'utiliser est principalement divisé en trois étapes:
1. Créez une classe d'implémentation d'interface de comparaison et attribuez une valeur à un objet
Écrivez des règles de tri pour les classes personnalisées dans la méthode de comparaison
2. Passez l'objet comparateur en tant que paramètre à une méthode de la classe de tri
3. Ajoutez une classe personnalisée utilisée dans la méthode de comparaison à la classe de tri
Par exemple:
// 1. Créer un objet qui implémente l'interface du comparateur Comparateur = new Comparator () {@Override public int compare (objet objet1, objet objet2) {if (object1 instanceof newBookBean && object2 instanceof newBookBean) {newBookBean newBookBean = (newBookBean) object1; NewBookBean newBookBean1 = (newBookBean) objet2; // Reportez-vous à la comparaison du tri naturel pour la méthode de la méthode de comparaison spécifique, voici un retour de châtaignier newbookbean.getCount () - newBookBean1.getCount (); } return 0; }}; // 2. Passez cet objet en tant que paramètre formel au constructeur de Treeset Treeset = new Treeset (comparateur); // 3. Ajoutez l'objet de la classe conçue dans la méthode de comparaison à l'étape 1 à l'arbret à l'arreset arreset.add (new NewBookBean ("a", 34)); TreeSet.Add (new NewBookBean ("S", 1)); TreeSet.Add (new NewBookBean ("V", 46)); TreeSet.Add (New NewBookBean ("Q", 26));En fait, nous pouvons voir que l'utilisation du comparateur est un modèle de stratégie. Les étudiants qui ne connaissent pas le modèle de stratégie peuvent cliquer ici pour voir: Mode stratégique: découvrez la routine fixe des romans en ligne.
Une référence à l'interface du comparateur est maintenue dans la classe de tri:
Comparateur <? Super K> Comparateur;
Nous pouvons transmettre diverses classes de mise en œuvre du comparateur de règles personnalisées et formuler différentes stratégies de tri pour la même classe.
Résumer
Deux méthodes de tri à Java:
Tri naturel comparable. (Implémentation de la classe d'entité)
Le comparateur est un type personnalisé. (Si la classe d'entité ne peut pas être modifiée, elle est créée directement sur l'appelant)
Lorsqu'il existe en même temps, il utilise les règles du comparateur (tri personnalisé) pour la comparaison.
Pour certains types de données ordinaires (tels que String, Integer, Double ...), ils implémentent l'interface comparable par défaut et implémentent la méthode Compareto, que nous pouvons utiliser directement.
Pour certaines classes personnalisées, ils peuvent avoir besoin de mettre en œuvre différentes stratégies de comparaison dans différentes situations. Nous pouvons créer une nouvelle interface de comparaison, puis la comparer à l'aide d'une implémentation de comparaison spécifique.
C'est la différence entre comparable et comparateur.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!