Java ponuja dva vmesnika za razvrščanje objektov z uporabo podatkovnih članov razreda:
jfx java tutorial
- Primerljivo
- Primerjalnik
Uporaba primerljivega vmesnika
Primerljiv predmet se lahko primerja z drugim predmetom. Razred sam mora izvajati java.lang.Primerljivo vmesnik za primerjavo njegovih primerkov.
Razmislite o razredu Film, ki ima člane, kot so, ocena, ime, leto. Recimo, da želimo razvrstiti seznam filmov glede na leto izdaje. Vmesnik Comparable lahko implementiramo z razredom Movie in preglasimo metodo compareTo() vmesnika 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());> >}> >}> }> |
>
>Izhod
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>
Zdaj pa recimo, da želimo filme razvrstiti tudi po njihovi oceni in imenih. Ko naredimo element zbirke primerljiv (tako da implementira Comparable), imamo samo eno priložnost za implementacijo metode compareTo(). Rešitev je uporaba Primerjalnik.
Uporaba primerjalnika
Za razliko od Comparable je Comparator zunaj tipa elementa, ki ga primerjamo. To je ločen razred. Ustvarimo več ločenih razredov (ki izvajajo Comparator) za primerjavo po različnih članih.
Razred Collections ima drugo metodo sort() in uporablja Comparator. Metoda sort() prikliče compare() za razvrščanje predmetov.
Za primerjavo filmov po oceni moramo narediti 3 stvari:
- Ustvarite razred, ki implementira Comparator (in s tem metodo compare(), ki opravi delo, ki ga je prej opravil compareTo()).
- Naredite primerek razreda Comparator.
- Pokličite preobremenjeno metodo sort() in ji dajte seznam in primerek razreda, ki implementira 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()) vrni 1; sicer vrni 0; } } // Razred za primerjavo filmov po imenu class NameCompare implements Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Razred gonilnika class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(nov film('Sila se prebuja', 8.3, 2015)); list.add(nov film('Vojna zvezd', 8.7, 1977)); list.add( nov film ('Imperij vrača udarec', 8.8, 1980)); list.add( nov film ('Jedijeva vrnitev', 8.4, 1983)); // Razvrsti po oceni : (1) Ustvari objekt // ratingCompare // (2) Call Collections.sort // (3) Tiskanje razvrščenega seznama System.out.println('Razvrščeno po oceni'); RatingCompare ratingCompare = novo OcenaCompare(); Zbirke.sort(seznam, ratingCompare); za (filmski film: seznam) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Pokliči preobremenjeno metodo razvrščanja z RatingCompare // (isti trije koraki kot zgoraj) System.out.println('
Razvrščeno po imenu'); NameCompare nameCompare = novo NameCompare(); Zbirke.sort(seznam, imePrimerjava); za (filmski film: seznam) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Uporablja Primerljivo za razvrščanje po letu System.out.println('
Razvrščeno po letu'); Zbirke.sort(seznam); za (filmski film : seznam) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
>
Izhod:
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>
- Primerljivo je namenjeno objektom z naravnim vrstnim redom, kar pomeni, da mora predmet sam vedeti, kako naj bo urejen. Na primer imenske številke študentov. Razvrščanje vmesnika Comparator pa poteka prek ločenega razreda.
- Logično je, da vmesnik Comparable primerja to referenco z navedenim objektom, Comparator v Javi pa primerja dva ponujena različna predmeta razreda.
- Če kateri koli razred implementira vmesnik Comparable v Javi, potem je mogoče zbirko tega predmeta, bodisi List ali Array, samodejno razvrstiti z uporabo metode Collections.sort() ali Arrays.sort(), objekti pa bodo razvrščeni na podlagi naravnega vrstnega reda, ki ga definira metoda CompareTo.
- Osnovna razlikovalna značilnost je, da lahko z uporabo primerljivih uporabimo samo eno primerjavo. Medtem ko lahko za določeno vrsto napišemo več kot enega primerjalnika po meri, pri čemer vsi uporabljajo različne interpretacije, kaj pomeni razvrščanje. Tako kot v primerljivem primeru smo lahko razvrstili samo po enem atributu, tj. letu, vendar smo v primerjalniku lahko uporabili tudi različne atribute, kot so ocena, ime in leto.
Če povzamemo, če mora razvrščanje predmetov temeljiti na naravnem vrstnem redu, potem uporabite Comparable, medtem ko če morate razvrščati po atributih različnih predmetov, uporabite Comparator v Javi.