Java nodrošina divas saskarnes objektu šķirošanai, izmantojot klases datu dalībniekus:
- Salīdzināms
- Salīdzinātājs
Izmantojot salīdzināmu interfeisu
Salīdzināms objekts spēj salīdzināt sevi ar citu objektu. Klasei pašai ir jāīsteno java.lang.Salīdzināms saskarne, lai salīdzinātu tās gadījumus.
Apsveriet filmu klasi, kurā ir tādi dalībnieki kā vērtējums, vārds, gads. Pieņemsim, ka mēs vēlamies kārtot filmu sarakstu, pamatojoties uz izlaišanas gadu. Mēs varam ieviest salīdzināmo saskarni ar filmu klasi, un mēs ignorējam Comparable interfeisa metodi salīdzinātTo().
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());> >}> >}> }> |
>
vai abstraktai klasei var būt konstruktors
>Izvade
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>
Tagad pieņemsim, ka mēs vēlamies kārtot filmas arī pēc to vērtējuma un nosaukumiem. Kad mēs padarām kolekcijas elementu salīdzināmu (liekot tam ieviest Comparable), mēs iegūstam tikai vienu iespēju ieviest salīdzinātTo() metodi. Risinājums tiek izmantots Salīdzinātājs.
Izmantojot salīdzinājumu
Atšķirībā no Comparable, Comparator ir ārpus elementa veida, kuru mēs salīdzinām. Tā ir atsevišķa klase. Mēs izveidojam vairākas atsevišķas klases (kas ievieš Comparator), lai salīdzinātu dažādus dalībniekus.
Kolekciju klasei ir otrā sort() metode, un tai ir nepieciešams Comparator. Metode sort() izsauc salīdzinājumu (), lai kārtotu objektus.
Lai salīdzinātu filmas pēc vērtējuma, mums ir jāveic 3 lietas:
- Izveidojiet klasi, kas ievieš Comparator (un līdz ar to salīdzināšanas () metodi, kas veic darbu, ko iepriekš veica salīdzinātTo()).
- Izveidojiet klases Comparator instanci.
- Izsauciet overloaded sort() metodi, piešķirot tai gan sarakstu, gan tās klases gadījumu, kas ievieš 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()) atgriešanās 1; citādi atgriež 0; } } // Salīdzināmā klase Filmas pēc nosaukuma class NosaukumsSalīdzināt ievieš Comparator { public int salīdzināt(Filma m1, Filma m2) { return m1.getName().compareTo(m2.getName()); } } // Draiveri klase Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new Movie('Force Awakens', 8.3, 2015)); list.add(new Movie('Zvaigžņu kari', 8.7, 1977)); list.add( new Movie('Empire Strikes Back', 8.8, 1980)); list.add( new Movie('Jedi atgriešanās', 8.4, 1983)); // Kārtot pēc vērtējuma : (1) Izveidot // vērtējuma objektuSalīdzināt // (2) Call Collections.sort // (3) Drukāt Kārtotais saraksts System.out.println('Sorted by rating'); VērtējumsSalīdzināt vērtējumuSalīdzināt = new VērtējumsSalīdzināt(); Collections.sort(saraksts, vērtējumsSalīdzināt); for (Filma filma : saraksts) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Izsaukt pārslogotās kārtošanas metodi ar RatingCompare // (Tās pašas trīs darbības kā iepriekš) System.out.println('
Kārtots pēc nosaukuma'); NosaukumsSalīdzināt nosaukumsSalīdzināt = new NosaukumsSalīdzināt(); Collections.sort(saraksts, nosaukumsSalīdzināt); for (Filma filma : saraksts) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Izmanto Salīdzināms, lai kārtotu pēc gada System.out.println('
Kārtots pēc gada'); Collections.sort(saraksts); for (Filmas filma : saraksts) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
>
Izvade:
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>
- Salīdzināmais ir paredzēts objektiem ar dabisku sakārtotību, kas nozīmē, ka objektam pašam ir jāzina, kā tas ir jāsakārto. Piemēram, studentu skaits. Savukārt Comparator interfeisa šķirošana tiek veikta, izmantojot atsevišķu klasi.
- Loģiski, ka Comparable interfeiss salīdzina šo atsauci ar norādīto objektu, un Java Comparator salīdzina divus dažādus piedāvātos klases objektus.
- Ja kāda klase ievieš salīdzināmu saskarni Java, tad šī objekta kolekciju List vai Array var kārtot automātiski, izmantojot Collections.sort() vai Arrays.sort() metodi, un objekti tiks sakārtoti, pamatojoties uz dabisko secību, kas noteikta ar CompareTo metodi.
- Galvenā atšķirīgā iezīme ir tāda, ka, izmantojot salīdzināmus, mēs varam izmantot tikai vienu salīdzinājumu. Tā kā mēs varam rakstīt vairāk nekā vienu pielāgotu salīdzinātāju, kā vēlaties konkrētam tipam, izmantojot dažādas interpretācijas par to, ko nozīmē šķirošana. Tāpat kā salīdzināmajā piemērā, mēs varējām kārtot tikai pēc viena atribūta, t.i., gada, bet salīdzinātājā mēs varējām izmantot arī dažādus atribūtus, piemēram, vērtējumu, vārdu un gadu.
Rezumējot, ja objektu šķirošanai ir jābalstās uz dabisku secību, izmantojiet Salīdzināmo, savukārt, ja kārtošana jāveic pēc dažādu objektu atribūtiem, tad Java izmantojiet Comparator.