logo

Comparable vs Comparator v Javě

Java poskytuje dvě rozhraní pro třídění objektů pomocí datových členů třídy:

  1. Srovnatelný
  2. Komparátor

Použití srovnatelného rozhraní

Srovnatelný objekt je schopen se srovnávat s jiným objektem. Samotná třída musí implementovat java.lang.Porovnatelné rozhraní pro porovnání jeho instancí.
Zvažte třídu Film, která má členy jako, hodnocení, jméno, rok. Předpokládejme, že chceme seřadit seznam filmů podle roku vydání. Můžeme implementovat rozhraní Comparable s třídou Movie a přepíšeme metodu CompareTo() rozhraní Comparable.



Jáva




získat aktuální datum v jazyce Java

nový řádek python
// 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());> >}> >}> }>

>

>

Výstup

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>

Nyní předpokládejme, že chceme seřadit filmy také podle hodnocení a jmen. Když uděláme prvek kolekce srovnatelný (tím, že jej implementujeme Comparable), dostaneme pouze jednu šanci implementovat metodu CompareTo(). Řešením je použití Komparátor.

Pomocí komparátoru

Na rozdíl od Comparable je Comparator externí vůči typu prvku, který porovnáváme. Je to samostatná třída. Vytváříme několik samostatných tříd (které implementují komparátor), abychom je mohli porovnávat různými členy.
Třída Collections má druhou metodu sort() a používá komparátor. Metoda sort() vyvolá funkci Compare() k řazení objektů.

připojení java mysql

Abychom mohli porovnat filmy podle hodnocení, musíme udělat 3 věci:

  1. Vytvořte třídu, která implementuje Comparator (a tedy metodu Compare(), která provádí práci, kterou dříve vykonala funkce CompareTo()).
  2. Vytvořte instanci třídy Comparator.
  3. Zavolejte přetíženou metodu sort() a dejte jí seznam i instanci třídy, která implementuje komparátor.

Jáva




// 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; jinak vrátit 0; } } // Třída pro porovnání filmů podle názvu class NameCompare implements Comparator { public int Compare(Film m1, Film m2) { return m1.getName().compareTo(m2.getName()); } } // Třída ovladače 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 vrací úder', 8.8, 1980)); list.add( new Movie('Návrat Jedi', 8.4, 1983)); // Seřadit podle hodnocení : (1) Vytvořit objekt // ratingCompare // (2) Volat Collections.sort // (3) Tisknout seřazený seznam System.out.println('Seřazeno podle hodnocení'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(seznam, hodnoceníPorovnat); for (Filmový film: seznam) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Volání přetížené metody třídění pomocí RatingCompare // (Stejné tři kroky jako výše) System.out.println(' Seřazeno podle názvu'); NameCompare nameCompare = new NameCompare(); Collections.sort(seznam, názevPorovnat); for (Filmový film : seznam) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Použije Comparable k řazení podle roku System.out.println(' Seřazeno podle roku'); Collections.sort(seznam); for (Filmový film : seznam) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

příklad seznamu v Javě

>

Výstup:

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>
  • Porovnatelné je určeno pro objekty s přirozeným uspořádáním, což znamená, že objekt sám musí vědět, jak má být uspořádán. Například Roll Numbers of students. Zatímco řazení rozhraní komparátoru se provádí prostřednictvím samostatné třídy.
  • Logicky, Comparable interface porovnává tento odkaz se zadaným objektem a Comparator v Javě porovnává dva různé poskytnuté objekty třídy.
  • Pokud nějaká třída implementuje rozhraní Comparable v Javě, pak kolekci tohoto objektu buď List nebo Array lze třídit automaticky pomocí metody Collections.sort() nebo Arrays.sort() a objekty budou seřazeny podle přirozeného pořadí definovaného metodou CompareTo.
  • Základním rozlišovacím znakem je, že pomocí srovnatelného můžeme použít pouze jedno srovnání. Zatímco pro daný typ můžeme napsat více než jeden vlastní komparátor, jak chcete, všechny pomocí různých interpretací toho, co řazení znamená. Stejně jako ve srovnatelném příkladu jsme mohli řadit pouze podle jednoho atributu, tj. roku, ale v komparátoru jsme mohli použít různé atributy, jako je hodnocení, jméno a rok.

Abychom to shrnuli, pokud třídění objektů musí být založeno na přirozeném pořadí, použijte Comparable, zatímco pokud je třeba třídit podle atributů různých objektů, použijte Comparator v Javě.