Java oferă două interfețe pentru sortarea obiectelor folosind membrii de date ai clasei:
- Comparabil
- 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.
bara de instrumente cu acces rapid ms Word
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());> >}> >}> }> |
>
variabila bash
>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:
- Creați o clasă care implementează Comparator (și astfel metoda compare() care face munca făcută anterior de compareTo()).
- Faceți o instanță a clasei Comparator.
- 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() + ' '); } }>>> |
str la int
>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>
- Comparabil este destinat obiectelor cu ordonare naturală, ceea ce înseamnă că obiectul însuși trebuie să știe cum urmează să fie ordonat. De exemplu, Numerele de rulare ale elevilor. Întrucât, sortarea interfeței Comparator se face printr-o clasă separată.
- În mod logic, interfața Comparable compară această referință cu obiectul specificat, iar Comparator în Java compară două obiecte de clasă diferite furnizate.
- Dacă orice clasă implementează o interfață comparabilă în Java, atunci colecția acelui obiect fie Listă, fie Array poate fi sortată automat utilizând metoda Collections.sort() sau Arrays.sort(), iar obiectele vor fi sortate pe baza ordinii naturale definite de metoda CompareTo.
- O caracteristică de diferențiere de bază este că, folosind comparabile, putem folosi o singură comparație. Întrucât, putem scrie mai mult de un comparator personalizat după cum doriți pentru un anumit tip, toate folosind interpretări diferite ale ceea ce înseamnă sortarea. La fel ca în exemplul comparabil, am putea sorta doar după un singur atribut, adică anul, dar în comparator am putut folosi diferite atribute, cum ar fi evaluarea, numele și anul.
Pentru a rezuma, dacă sortarea obiectelor trebuie să se bazeze pe ordinea naturală, atunci utilizați Comparabil, în timp ce dacă sortarea trebuie făcută pe atribute ale diferitelor obiecte, atunci utilizați Comparator în Java.