Java biedt twee interfaces om objecten te sorteren met behulp van gegevensleden van de klasse:
- Vergelijkbaar
- Comparator
Met behulp van een vergelijkbare interface
Een vergelijkbaar object is in staat zichzelf te vergelijken met een ander object. De klasse zelf moet de java.lang.Vergelijkbaar interface om de instanties te vergelijken.
Overweeg een filmklasse met leden zoals beoordeling, naam en jaar. Stel dat we een lijst met films willen sorteren op basis van het jaar van uitgave. We kunnen de Comparable-interface implementeren met de Movie-klasse, en we overschrijven de methode CompareTo() van Comparable Interface.
Ankita Lokhande leeftijd
Java
in een string werpen
// 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());> >}> >}> }> |
>
>Uitvoer
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>
Stel nu dat we films ook willen sorteren op classificatie en naam. Wanneer we een verzamelingselement vergelijkbaar maken (door het Comparable te laten implementeren), krijgen we slechts één kans om de methode CompareTo() te implementeren. De oplossing is gebruiken Comparator.
Vergelijker gebruiken
In tegenstelling tot Comparable is Comparator extern aan het elementtype dat we vergelijken. Het is een aparte klasse. We creëren meerdere afzonderlijke klassen (die Comparator implementeren) om door verschillende leden te vergelijken.
De klasse Collections heeft een tweede methode sort() en daarvoor is Comparator nodig. De methode sort() roept de vergelijking() aan om objecten te sorteren.
Om films op beoordeling te vergelijken, moeten we drie dingen doen:
logo-java
- Maak een klasse die Comparator implementeert (en dus de methode Compare() die het werk doet dat voorheen door CompareTo() werd gedaan).
- Maak een instantie van de klasse Comparator.
- Roep de overbelaste methode sort() aan en geef deze zowel de lijst als de instantie van de klasse die Comparator implementeert.
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()) retourneert 1; anders retourneer 0; } } // Klasse om films op naam te vergelijken klasse NameCompare implementeert Comparator { public int Compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Stuurprogrammaklasse klasse Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(nieuwe film('Force Awakens', 8.3, 2015)); list.add(nieuwe film('Star Wars', 8.7, 1977)); list.add(nieuwe film('Empire Strikes Back', 8.8, 1980)); list.add(nieuwe film('Return of the Jedi', 8.4, 1983)); // Sorteer op beoordeling: (1) Maak een object van // ratingCompare // (2) Roep Collections.sort aan // (3) Afdrukken Gesorteerde lijst System.out.println('Gesorteerd op beoordeling'); BeoordelingVergelijk beoordelingVergelijk = nieuwe BeoordelingVergelijk(); Collections.sort(lijst, beoordelingVergelijken); for (Filmfilm: lijst) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Roep de overbelaste sorteermethode aan met RatingCompare // (Dezelfde drie stappen als hierboven) System.out.println('
Gesorteerd op naam'); NaamVergelijk naamVergelijk = nieuwe NaamVergelijk(); Collections.sort(lijst, naamVergelijken); for (Filmfilm: lijst) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Gebruik Vergelijkbaar met sorteren op jaar System.out.println('
Gesorteerd op jaar'); Collecties.sort(lijst); for (Filmfilm: lijst) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
wat is uitzonderingsafhandeling in Java
>
Uitgang:
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>
- Vergelijkbaar is bedoeld voor objecten met een natuurlijke ordening, wat betekent dat het object zelf moet weten hoe het geordend moet worden. Bijvoorbeeld Rolnummers van studenten. Terwijl het sorteren van de Comparator-interface via een aparte klasse gebeurt.
- Logischerwijs vergelijkt de Comparable-interface deze referentie met het opgegeven object en vergelijkt Comparator in Java twee verschillende aangeboden klasseobjecten.
- Als een klasse een vergelijkbare interface in Java implementeert, kan de verzameling van dat object, List of Array, automatisch worden gesorteerd met behulp van de methode Collections.sort() of Arrays.sort() en worden objecten gesorteerd op basis van de natuurlijke volgorde die is gedefinieerd door de CompareTo-methode.
- Een fundamenteel onderscheidend kenmerk is dat we bij gebruik van vergelijkbaar slechts één vergelijking kunnen gebruiken. Terwijl we voor een bepaald type meer dan één aangepaste vergelijker kunnen schrijven, allemaal met verschillende interpretaties van wat sorteren betekent. Net als in het vergelijkbare voorbeeld konden we sorteren op slechts één attribuut, namelijk jaar, maar in de comparator konden we ook verschillende attributen gebruiken, zoals beoordeling, naam en jaar.
Samenvattend: als het sorteren van objecten gebaseerd moet zijn op natuurlijke volgorde, gebruik dan Comparable, terwijl als u wilt sorteren op attributen van verschillende objecten, u Comparator in Java gebruikt.