Comparabil vs Comparator în Java

Java oferă două interfețe pentru sortarea obiectelor folosind membrii de date ai clasei:

  1. Comparabil
  2. Comparator

Utilizarea unei interfețe comparabile

Un obiect comparabil este capabil să se compare cu un alt obiect. Clasa însăși trebuie să implementeze java.lang.Comparabil interfață pentru a compara instanțele sale.
Luați în considerare o clasă de film care are membri precum, evaluare, nume, an. Să presupunem că dorim să sortăm o listă de filme în funcție de anul lansării. Putem implementa interfața Comparable cu clasa Movie și suprascriem metoda compareTo() a interfeței Comparable.

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());> > }> > }> }>

Ieșire

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 

Acum, să presupunem că vrem să sortăm filmele după rating și nume. Când facem comparabil un element de colecție (făcându-l să implementeze Comparable), avem o singură șansă de a implementa metoda compareTo(). Soluția este folosirea Comparator.

Folosind Comparator

Spre deosebire de Comparable, Comparator este extern tipului de element pe care îl comparăm. Este o clasă separată. Creăm mai multe clase separate (care implementează Comparator) pentru a le compara de către diferiți membri.
Clasa Collections are o a doua metodă sort() și necesită Comparator. Metoda sort() invocă compare() pentru a sorta obiectele.

Pentru a compara filmele după evaluare, trebuie să facem 3 lucruri:

  1. Creați o clasă care implementează Comparator (și astfel metoda compare() care face munca făcută anterior de compareTo()).
  2. Faceți o instanță a clasei Comparator.
  3. Apelați metoda sort() supraîncărcată, oferindu-i atât lista, cât și instanța clasei care implementează 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()) returnează 1; altfel returnează 0; } } // Clasa de comparat Filme după nume clasa NameCompare implementează Comparator { public int compare(Film m1, Film m2) { return m1.getName().compareTo(m2.getName()); } } // Clasa driverului Main { public static void main(String[] args) { Lista ArrayList = new ArrayList(); list.add(film nou('Force Awakens', 8.3, 2015)); list.add(film nou('Star Wars', 8.7, 1977)); list.add( film nou('Empire Strikes Back', 8.8, 1980)); list.add( new Movie('Return of the Jedi', 8.4, 1983)); // Sortare după rating : (1) Creați un obiect de // ratingCompare // (2) Call Collections.sort // (3) Print Sorted list System.out.println('Sorted by rating'); RatingCompare ratingCompare = nou RatingCompare(); Collections.sort(lista, ratingCompare); pentru (Film: listă) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Apelați metoda de sortare supraîncărcată cu RatingCompare // (Aceiași trei pași ca mai sus) System.out.println(' Sortat după nume'); NameCompare nameCompare = new NameCompare(); Collections.sort(listă, numeCompare); pentru (Film: listă) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Utilizări Comparabil pentru a sorta după an System.out.println(' Sortat după an'); Collections.sort(list); pentru (Film: listă) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>>>

>   

Virtualizare Linux - închisoare chroot