Java tillhandahåller två gränssnitt för att sortera objekt med hjälp av datamedlemmar i klassen:
primtal java
- Jämförbar
- Komparator
Använder jämförbart gränssnitt
Ett jämförbart objekt är kapabelt att jämföra sig själv med ett annat objekt. Klassen själv måste implementera java.lang.Comparable gränssnitt för att jämföra dess instanser.
Överväg en filmklass som har medlemmar som, betyg, namn, år. Anta att vi vill sortera en lista över filmer baserat på släppår. Vi kan implementera Comparable-gränssnittet med klassen Movie, och vi åsidosätter metoden compareTo() för Comparable-gränssnittet.
Java
mediaöverföring
// 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());> > }> > }> }> |
>
>Produktion
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 nu att vi också vill sortera filmer efter deras betyg och namn. När vi gör ett samlingselement jämförbart (genom att låta det implementera Comparable) får vi bara en chans att implementera compareTo()-metoden. Lösningen använder Komparator.
karta java
Använder Comparator
Till skillnad från Comparable är Comparator extern till elementtypen vi jämför. Det är en separat klass. Vi skapar flera separata klasser (som implementerar Comparator) för att jämföra med olika medlemmar.
Collections-klassen har en andra sort()-metod och den tar Comparator. Metoden sort() anropar compare() för att sortera objekt.
För att jämföra filmer efter betyg måste vi göra tre saker:
- Skapa en klass som implementerar Comparator (och därmed compare()-metoden som gör det arbete som tidigare gjorts av compareTo()).
- Gör en instans av klassen Comparator.
- Anropa metoden overloaded sort() och ge den både listan och instansen av klassen som implementerar 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()) return 1; annars returnerar 0; } } // Klass för att jämföra filmer efter namnklass NameCompare implementerar Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Driver class class 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)); // Sortera efter betyg : (1) Skapa ett objekt av // ratingCompare // (2) Ring Collections.sort // (3) Skriv ut Sorterad lista System.out.println('Sorterat efter betyg'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(lista, ratingCompare); för (Filmfilm: lista) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Anropa överbelastad sorteringsmetod med RatingCompare // (Samma tre steg som ovan) System.out.println('
Sorterat efter namn'); NameCompare nameCompare = new NameCompare(); Collections.sort(list, nameCompare); för (Filmfilm: lista) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Används jämförbar för att sortera efter år System.out.println('
Sorterat efter år'); Collections.sort(lista); för (Filmfilm: lista) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
teknikens fördelar och nackdelar
>
Produktion:
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>
- Jämförbar är avsedd för objekt med naturlig ordning vilket innebär att objektet självt måste veta hur det ska beställas. Till exempel Rulla Antal elever. Medan Comparator-gränssnittssortering sker genom en separat klass.
- Logiskt sett jämför Comparable interface denna referens med det angivna objektet och Comparator i Java jämför två olika klassobjekt som tillhandahålls.
- Om någon klass implementerar jämförbart gränssnitt i Java kan samlingen av objektet antingen List eller Array sorteras automatiskt genom att använda metoden Collections.sort() eller Arrays.sort() och objekt kommer att sorteras baserat på den naturliga ordningen som definieras av metoden CompareTo.
- En grundläggande särskiljande funktion är att med jämförbara kan vi bara använda en jämförelse. Medan vi kan skriva mer än en anpassad komparator som du vill för en viss typ, alla med olika tolkningar av vad sortering betyder. Som i det jämförbara exemplet kunde vi bara sortera efter endast ett attribut, d.v.s. år, men i komparatorn kunde vi också använda olika attribut som betyg, namn och år.
För att sammanfatta, om sortering av objekt måste baseras på naturlig ordning, använd Comparable medan om du sorterar behöver göras på attribut för olika objekt, använd sedan Comparator i Java.