„Java“ suteikia dvi sąsajas objektams rūšiuoti naudojant klasės duomenų narius:
- Palyginamas
- Palyginimas
Palyginamos sąsajos naudojimas
Palyginamas objektas gali palyginti save su kitu objektu. Pati klasė turi įgyvendinti java.lang.Palyginama sąsaja, kad būtų galima palyginti jos atvejus.
Apsvarstykite filmų klasę, kurioje yra tokių narių kaip įvertinimas, pavadinimas, metai. Tarkime, kad norime rūšiuoti filmų sąrašą pagal išleidimo metus. Galime įdiegti palyginamąją sąsają su Movie klase ir nepaisome palyginimo sąsajos metodo palyginimo().
Java
paryškintas tekstas css
žemėlapis mašinraščiu
// 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());> >}> >}> }> |
>
>Išvestis
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>
Tarkime, kad norime rūšiuoti filmus pagal jų įvertinimą ir pavadinimus. Kai kolekcijos elementą padarome palyginamą (įdiegus jį Comparable), gauname tik vieną galimybę įgyvendinti palyginimo() metodą. Sprendimas naudojamas Palyginimas.
Komparatoriaus naudojimas
Skirtingai nuo „Comparable“, „Comparator“ yra išorinis elemento tipas, kurį lyginame. Tai atskira klasė. Sukuriame kelias atskiras klases (kuriose įdiegtas Comparator), kad galėtume palyginti skirtingus narius.
Kolekcijos klasė turi antrąjį sort() metodą ir jai reikia Comparator. Rūšiuoti () metodas iškviečia palyginimą () objektams rūšiuoti.
Norėdami palyginti filmus pagal įvertinimą, turime atlikti 3 dalykus:
- Sukurkite klasę, kuri įgyvendina Comparator (taigi ir palyginimo () metodą, kuris atlieka darbą, kurį anksčiau atliko palyginimasTo ()).
- Padarykite Comparator klasės egzempliorių.
- Iškvieskite overloaded sort() metodą, suteikdami jam sąrašą ir klasės, kuri įgyvendina Comparator, egzempliorių.
Java
konvertuoti eilutę į char
// 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()) return 1; kitaip grąžinti 0; } } // Klasė palyginimui Filmai pagal pavadinimą class PavadinimasPalyginti įgyvendina Comparator { public int palyginti(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Tvarkyklės klasė Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new Movie('Force Awakens', 8.3, 2015)); list.add(new Movie('Žvaigždžių karai', 8.7, 1977)); list.add( new Movie('Imperija atmuša', 8.8, 1980)); list.add( new Movie('Jedi sugrįžimas', 8.4, 1983)); // Rūšiuoti pagal įvertinimą : (1) Sukurti // įvertinimo objektą Palyginti // (2) Skambinti Collections.sort // (3) Spausdinti Rūšiuotų sąrašą System.out.println('Rūšiuota pagal įvertinimą'); ĮvertinimasPalyginti įvertinimasPalyginti = new ĮvertinimasPalyginti(); Kolekcijos.rūšiuoti(sąrašas, įvertinimasPalyginti); for (Filmo filmas : sąrašas) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Iškvieskite perkrautą rūšiavimo metodą su RatingCompare // (Trys tie patys veiksmai, kaip ir aukščiau) System.out.println('
Rūšiuota pagal pavadinimą'); VardasPalyginti vardąPalyginti = new NamePalyginti(); Kolekcijos.rūšiuoti(sąrašas, pavadinimasPalyginti); for (Filmo filmas : sąrašas) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Naudoja Palyginama, kad būtų galima rūšiuoti pagal metus System.out.println('
Rūšiuota pagal metus'); Kolekcijos.rūšiuoti(sąrašas); for (Filmo filmas : sąrašas) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>> |
>išanalizuoti eilutę į intSorted 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>
- Palyginamoji yra skirta objektams su natūralia tvarka, o tai reiškia, kad pats objektas turi žinoti, kaip jis turi būti tvarkomas. Pavyzdžiui, mokinių numeriai. Tuo tarpu palyginimo sąsajos rūšiavimas atliekamas per atskirą klasę.
- Logiškai mąstant, „Comparable“ sąsaja lygina šią nuorodą su nurodytu objektu, o „Comparator“ programoje „Java“ lygina du pateiktus skirtingų klasių objektus.
- Jei kuri nors klasė įdiegia „Java“ palyginamąją sąsają, to objekto rinkinys List arba Array gali būti automatiškai rūšiuojamas naudojant Collections.sort() arba Arrays.sort() metodą, o objektai bus rūšiuojami pagal natūralią tvarką, apibrėžtą CompareTo metodu.
- Pagrindinė skiriamoji ypatybė yra ta, kad naudodami palyginamąjį galime naudoti tik vieną palyginimą. Tuo tarpu tam tikram tipui galime parašyti daugiau nei vieną tinkintą lyginamąjį elementą, naudojant skirtingus aiškinimus, ką reiškia rūšiavimas. Kaip ir palyginamajame pavyzdyje, galėjome rūšiuoti tik pagal vieną atributą, t. y. metus, tačiau lyginamajame įrenginyje taip pat galėjome naudoti skirtingus atributus, pvz., įvertinimą, pavadinimą ir metus.
Apibendrinant, jei objektų rūšiavimas turi būti pagrįstas natūralia tvarka, naudokite Comparable, o jei rūšiuojate pagal skirtingų objektų atributus, naudokite „Java“ palyginimo priemonę.