logo

Comparable vs Comparateur en Java

Java fournit deux interfaces pour trier les objets à l'aide des données membres de la classe :

  1. Comparable
  2. Comparateur

Utilisation d'une interface comparable



Un objet comparable est capable de se comparer à un autre objet. La classe elle-même doit implémenter le java.lang.Comparable interface pour comparer ses instances.
Considérez une classe de films dont les membres aiment leur classement, leur nom et leur année. Supposons que nous souhaitions trier une liste de films en fonction de l'année de sortie. Nous pouvons implémenter l'interface Comparable avec la classe Movie, et nous remplaçons la méthode compareTo() de l'interface Comparable.

Java-Lambda

Java








// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }>

>

les bases de Java

>

Sortir

Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>

Supposons maintenant que nous souhaitions également trier les films en fonction de leur classement et de leur nom. Lorsque nous rendons un élément de collection comparable (en lui faisant implémenter Comparable), nous n'avons qu'une seule chance d'implémenter la méthode compareTo(). La solution utilise Comparateur.

Utiliser le comparateur

Contrairement à Comparable, Comparator est externe au type d’élément que nous comparons. C'est une classe à part. Nous créons plusieurs classes distinctes (qui implémentent Comparator) pour comparer différents membres.
La classe Collections a une deuxième méthode sort() et elle prend Comparator. La méthode sort() appelle compare() pour trier les objets.

Pour comparer des films par note, nous devons faire 3 choses :

  1. Créez une classe qui implémente Comparator (et donc la méthode compare() qui effectue le travail précédemment effectué par compareTo()).
  2. Créez une instance de la classe Comparator.
  3. Appelez la méthode sort() surchargée, en lui donnant à la fois la liste et l'instance de la classe qui implémente Comparator.

Java




// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) renvoie 1 ; sinon, renvoie 0 ; } } // Classe pour comparer les films par nom class NameCompare implémente Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Classe de pilote class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(nouveau film('Force Awakens', 8.3, 2015)); list.add(nouveau film('Star Wars', 8.7, 1977)); list.add (nouveau film ('L'Empire contre-attaque', 8.8, 1980)); list.add( new Movie('Le Retour du Jedi', 8.4, 1983)); // Trier par note : (1) Créer un objet de // ratingCompare // (2) Appeler Collections.sort // (3) Imprimer la liste triée System.out.println('Trié par note'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(liste, ratingCompare); pour (Film film : liste) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Appel de la méthode de tri surchargée avec RatingCompare // (Les trois mêmes étapes que ci-dessus) System.out.println(' Sorted by name'); NameCompare nameCompare = new NameCompare(); Collections.sort(liste, nomCompare); pour (Film film : liste) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Utilise Comparable pour trier par année System.out.println(' Trié par année'); Collections.sort(liste); for (Film film : liste) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

>

Sortir:

Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
  • Comparable est destiné aux objets avec un ordre naturel, ce qui signifie que l'objet lui-même doit savoir comment il doit être ordonné. Par exemple, le nombre d'élèves. Alors que le tri de l’interface Comparator est effectué via une classe distincte.
  • Logiquement, l'interface Comparable compare cette référence avec l'objet spécifié et Comparator en Java compare deux objets de classe différents fournis.
  • Si une classe implémente l'interface Comparable en Java, la collection de cet objet, soit List ou Array, peut être triée automatiquement à l'aide de la méthode Collections.sort() ou Arrays.sort() et les objets seront triés en fonction de l'ordre naturel défini par la méthode CompareTo.
  • Une caractéristique fondamentale de différenciation est qu’en utilisant des comparables, nous ne pouvons utiliser qu’une seule comparaison. Tandis que nous pouvons écrire plusieurs comparateurs personnalisés comme vous le souhaitez pour un type donné, tous en utilisant différentes interprétations de ce que signifie le tri. Comme dans l'exemple comparable, nous pourrions simplement trier selon un seul attribut, c'est-à-dire l'année, mais dans le comparateur, nous avons également pu utiliser différents attributs tels que la note, le nom et l'année.

Pour résumer, si le tri des objets doit être basé sur l'ordre naturel, utilisez Comparable tandis que si le tri doit être effectué sur les attributs de différents objets, utilisez Comparator en Java.

chaîne java cmp