logo

Sammenlignelig vs Comparator i Java

Java giver to grænseflader til at sortere objekter ved hjælp af datamedlemmer af klassen:

  1. Sammenlignelig
  2. Komparator

Brug af sammenlignelig grænseflade



Et sammenligneligt objekt er i stand til at sammenligne sig selv med et andet objekt. Klassen skal selv implementere java.lang.Sammenlignelig grænseflade for at sammenligne dens forekomster.
Overvej en filmklasse, der har medlemmer som, rating, navn, år. Antag, at vi ønsker at sortere en liste over film baseret på udgivelsesår. Vi kan implementere Comparable-grænsefladen med Movie-klassen, og vi tilsidesætter metoden compareTo() fra Comparable-grænsefladen.

søgemaskine og eksempler

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());> >}> >}> }>

>

brug af operativsystem

>

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>

Antag nu, at vi også vil sortere film efter deres vurdering og navne. Når vi gør et samlingselement sammenligneligt (ved at lade det implementere Comparable), får vi kun én chance for at implementere compareTo()-metoden. Løsningen bruger Komparator.

Brug af komparator

I modsætning til Comparable er Comparator ekstern i forhold til den elementtype, vi sammenligner. Det er en separat klasse. Vi opretter flere separate klasser (der implementerer Comparator) for at sammenligne med forskellige medlemmer.
Collections-klassen har en anden sort()-metode, og den tager Comparator. Sort()-metoden påkalder compare() for at sortere objekter.

For at sammenligne film efter vurdering skal vi gøre 3 ting:

hvordan man finder blokerede numre på Android
  1. Opret en klasse, der implementerer Comparator (og dermed compare()-metoden, der udfører arbejdet tidligere udført af compareTo()).
  2. Lav en instans af Comparator-klassen.
  3. Kald metoden overloaded sort() og giver den både listen og instansen af ​​den klasse, der implementerer Comparator.

Java


skriftstørrelser i latex



// 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()) returner 1; ellers returnerer 0; } } // Klasse for at sammenligne film efter 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 efter vurdering : (1) Opret et objekt af // ratingCompare // (2) Ring til Collections.sort // (3) Udskriv Sorteret liste System.out.println('Sorteret efter vurdering'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(liste, vurderingSammenlign); for (Film film: liste) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Kald overbelastet sorteringsmetode med RatingCompare // (Samme tre trin som ovenfor) System.out.println(' Sorteret efter navn'); NameCompare nameCompare = new NameCompare(); Collections.sort(liste, navnSammenlign); for (Film film: liste) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Bruger sammenlignelig for at sortere efter år System.out.println(' Sorteret efter år'); Collections.sort(liste); for (Film film : liste) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

b+ træer

>

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>
  • Sammenlignelig er beregnet til objekter med naturlig orden, hvilket betyder, at objektet selv skal vide, hvordan det skal bestilles. For eksempel Roll Numbers af elever. Hvorimod Comparator-grænsefladesortering udføres gennem en separat klasse.
  • Logisk set sammenligner Comparable interface denne reference med det angivne objekt, og Comparator i Java sammenligner to forskellige leverede klasseobjekter.
  • Hvis en klasse implementerer sammenlignelig grænseflade i Java, kan samlingen af ​​det pågældende objekt enten List eller Array sorteres automatisk ved at bruge Collections.sort() eller Arrays.sort() metoden, og objekter vil blive sorteret baseret på den naturlige rækkefølge defineret af CompareTo metoden.
  • En grundlæggende differentierende funktion er, at ved at bruge sammenlignelig kan vi kun bruge én sammenligning. Hvorimod vi kan skrive mere end én tilpassede komparatorer, som du ønsker for en given type, alle ved hjælp af forskellige fortolkninger af, hvad sortering betyder. Ligesom i det sammenlignelige eksempel kunne vi bare sortere efter én egenskab, dvs. år, men i komparatoren kunne vi også bruge forskellige egenskaber som rating, navn og år.

For at opsummere, hvis sortering af objekter skal være baseret på naturlig rækkefølge, så brug Comparable, mens hvis du sorterer skal udføres på attributter for forskellige objekter, så brug Comparator i Java.