logo

Porovnateľné vs komparátor v Jave

Java poskytuje dve rozhrania na triedenie objektov pomocou údajových členov triedy:

  1. Porovnateľné
  2. Porovnávač

Používanie porovnateľného rozhrania



Porovnateľný objekt je schopný porovnávať sa s iným objektom. Samotná trieda musí implementovať java.lang.Porovnateľné rozhranie na porovnanie jeho inštancií.
Zvážte filmovú triedu, ktorá má členov ako, hodnotenie, meno, rok. Predpokladajme, že chceme triediť zoznam filmov podľa roku vydania. Rozhranie Comparable môžeme implementovať s triedou Movie a prepíšeme metódu CompareTo() rozhrania Comparable.

vek rihanny

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

>

java regex pre

>

Výkon

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>

Predpokladajme, že chceme filmy zoradiť aj podľa hodnotenia a názvov. Keď urobíme prvok kolekcie porovnateľným (tým, že ho implementujeme Comparable), dostaneme iba jednu šancu na implementáciu metódy CompareTo(). Riešenie sa používa Porovnávač.

Použitie komparátora

Na rozdiel od porovnateľného je komparátor externý voči typu prvku, ktorý porovnávame. Je to samostatná trieda. Vytvárame viacero samostatných tried (ktoré implementujú komparátor), aby sme ich mohli porovnávať rôznymi členmi.
Trieda Collections má druhú metódu sort() a používa komparátor. Metóda sort() vyvolá funkciu Compare() na triedenie objektov.

Na porovnanie filmov podľa hodnotenia musíme urobiť 3 veci:

  1. Vytvorte triedu, ktorá implementuje Comparator (a teda metódu Compare(), ktorá vykonáva prácu predtým vykonanú pomocou funkcie CompareTo()).
  2. Vytvorte inštanciu triedy Comparator.
  3. Zavolajte preťaženú metódu sort() a dajte jej zoznam aj inštanciu triedy, ktorá implementuje komparátor.

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()) návrat 1; inak vráti 0; } } // Trieda na porovnanie filmov podľa názvu class NameCompare implements Comparator { public int porovnanie(Film m1, Film m2) { return m1.getName().compareTo(m2.getName()); } } // Trieda ovládača 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('Impérium vracia úder', 8.8, 1980)); list.add( new Movie('Návrat Jedi', 8.4, 1983)); // Zoradiť podľa hodnotenia : (1) Vytvorte objekt // ratingPorovnať // (2) Zavolajte Collections.sort // (3) Vytlačte triedený zoznam System.out.println('Sorted by rating'); HodnoteniePorovnať hodnoteniePorovnať = new RatingCompare(); Collections.sort(zoznam, hodnoteniePorovnať); for (Filmový film : zoznam) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Zavolajte preťaženú metódu triedenia pomocou RatingCompare // (Rovnaké tri kroky ako vyššie) System.out.println(' Zoradené podľa názvu'); NameCompare nameCompare = new NameCompare(); Collections.sort(zoznam, názovPorovnať); for (Filmový film : zoznam) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Používa Porovnateľné na triedenie podľa roku System.out.println(' Zoradené podľa roku'); Collections.sort(zoznam); for (Filmový film : zoznam) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

>

Výkon:

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>
  • Porovnateľné je určené pre objekty s prirodzeným usporiadaním, čo znamená, že samotný objekt musí vedieť, ako má byť usporiadaný. Napríklad počet študentov. Zatiaľ čo triedenie rozhrania komparátora sa vykonáva prostredníctvom samostatnej triedy.
  • Logicky, Comparable interface porovnáva túto referenciu so špecifikovaným objektom a Comparator v Java porovnáva dva rôzne poskytnuté objekty triedy.
  • Ak niektorá trieda implementuje rozhranie Comparable v jazyku Java, potom kolekciu tohto objektu buď List alebo Array možno triediť automaticky pomocou metódy Collections.sort() alebo Arrays.sort() a objekty budú triedené na základe prirodzeného poradia definovaného metódou CompareTo.
  • Základným rozlišovacím znakom je, že pri použití porovnateľných môžeme použiť iba jedno porovnanie. Zatiaľ čo pre daný typ môžeme napísať viac ako jeden vlastný porovnávač, ako chcete, pričom všetky používajú rôzne interpretácie toho, čo znamená triedenie. Podobne ako v porovnateľnom príklade sme mohli triediť iba podľa jedného atribútu, tj roku, ale v porovnávači sme mohli použiť aj rôzne atribúty, ako je hodnotenie, názov a rok.

Aby sme to zhrnuli, ak triedenie objektov musí byť založené na prirodzenom poradí, použite Porovnateľné, zatiaľ čo ak je potrebné triediť podľa atribútov rôznych objektov, použite Porovnávač v Jave.

pre slučku java