Java gir to grensesnitt for å sortere objekter ved hjelp av datamedlemmer i klassen:
- Sammenlignbar
- Komparator
Bruker sammenlignbart grensesnitt
Et sammenlignbart objekt er i stand til å sammenligne seg selv med et annet objekt. Klassen selv må implementere java.lang.Sammenlignbar grensesnitt for å sammenligne forekomstene.
Vurder en filmklasse som har medlemmer som, vurdering, navn, år. Anta at vi ønsker å sortere en liste over filmer basert på utgivelsesår. Vi kan implementere Comparable-grensesnittet med Movie-klassen, og vi overstyrer metoden compareTo() til Comparable-grensesnittet.
hvordan lese csv-filen i java
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());> >}> >}> }> |
>
python-baneinnstilling
>Produksjon
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>
Anta nå at vi ønsker å sortere filmer etter rangering og navn også. Når vi gjør et samlingselement sammenlignbart (ved å la det implementere Comparable), får vi bare én sjanse til å implementere compareTo()-metoden. Løsningen bruker Komparator.
Bruke komparator
I motsetning til Comparable, er Comparator ekstern i forhold til elementtypen vi sammenligner. Det er en egen klasse. Vi oppretter flere separate klasser (som implementerer Comparator) for å sammenligne med forskjellige medlemmer.
Collections-klassen har en andre sort()-metode og den tar Comparator. Sort()-metoden påkaller compare() for å sortere objekter.
For å sammenligne filmer etter vurdering, må vi gjøre 3 ting:
array vs arraylist
- Lag en klasse som implementerer Comparator (og dermed compare()-metoden som gjør arbeidet tidligere gjort av compareTo()).
- Lag en forekomst av Comparator-klassen.
- Kall metoden overloaded sort() og gir den både listen og forekomsten av klassen som implementerer Comparator.
Java
cdr full form
// 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; ellers returnerer 0; } } // Klasse for å sammenligne filmer etter navn klasse NameCompare implementerer Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Driver klasse klasse Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(ny film('Force Awakens', 8.3, 2015)); list.add(ny film('Star Wars', 8.7, 1977)); list.add( ny film('Empire Strikes Back', 8.8, 1980)); list.add(ny film('Return of the Jedi', 8.4, 1983)); // Sorter etter vurdering : (1) Lag et objekt av // ratingCompare // (2) Ring Collections.sort // (3) Skriv ut Sortert liste System.out.println('Sortert etter vurdering'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(liste, vurderingSammenlign); for (Filmfilm: liste) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Anrop overbelastet sorteringsmetode med RatingCompare // (Samme tre trinn som ovenfor) System.out.println('
Sortert etter navn'); NameCompare nameCompare = new NameCompare(); Collections.sort(liste, navnSammenlign); for (Filmfilm: liste) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Bruker Sammenlignbar for å sortere etter år System.out.println('
Sortert etter år'); Collections.sort(liste); for (Filmfilm: liste) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
b+ trær
>
Produksjon:
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>
- Sammenlignbar er ment for objekter med naturlig rekkefølge som betyr at objektet selv må vite hvordan det skal bestilles. For eksempel Roll Numbers of students. Mens Comparator-grensesnittsortering gjøres gjennom en egen klasse.
- Logisk sett sammenligner Comparable interface denne referansen med objektet som er spesifisert, og Comparator i Java sammenligner to forskjellige klasseobjekter.
- Hvis en klasse implementerer sammenlignbart grensesnitt i Java, kan samlingen av objektet enten List eller Array sorteres automatisk ved å bruke metoden Collections.sort() eller Arrays.sort() og objekter vil bli sortert basert på den naturlige rekkefølgen definert av CompareTo-metoden.
- En grunnleggende differensierende funksjon er at ved å bruke sammenlignbare kan vi bare bruke én sammenligning. Mens vi kan skrive mer enn én tilpasset komparator som du vil for en gitt type, alle ved å bruke forskjellige tolkninger av hva sortering betyr. Som i det sammenlignbare eksemplet kunne vi bare sortere etter én attributt, dvs. år, men i komparatoren kunne vi også bruke forskjellige attributter som rangering, navn og år.
For å oppsummere, hvis sortering av objekter må være basert på naturlig rekkefølge, bruk Comparable, mens hvis du sorterer må gjøres på attributter til forskjellige objekter, bruk Comparator i Java.