logo

Vertaileva vs Comparator Javassa

Java tarjoaa kaksi käyttöliittymää objektien lajitteluun käyttämällä luokan datajäseniä:

javafx on eclipse
  1. Vertailukelpoinen
  2. Vertailija

Vertailevan käyttöliittymän käyttäminen



Vertailukelpoinen objekti pystyy vertaamaan itseään toiseen kohteeseen. Luokan itsensä tulee toteuttaa java.lang.Comparable käyttöliittymän tapausten vertailua varten.
Harkitse elokuvaluokkaa, jossa on jäseniä, kuten luokitus, nimi, vuosi. Oletetaan, että haluamme lajitella elokuvien luettelon julkaisuvuoden perusteella. Voimme toteuttaa Comparable-rajapinnan Movie-luokassa ja ohitamme Comparable-liitännän metodin componentTo().

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

>

>

Lähtö

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>

Oletetaan nyt, että haluamme lajitella elokuvat myös niiden luokituksen ja nimien mukaan. Kun teemme kokoelmaelementin vertailukelpoiseksi (ottamalla sen käyttöön Comparable), saamme vain yhden mahdollisuuden toteuttaa vertaa()-menetelmä. Ratkaisu on käytössä Vertailija.

Comparatorin käyttö

Toisin kuin Comparable, Comparator on vertailemamme elementtityypin ulkopuolella. Se on erillinen luokka. Luomme useita erillisiä luokkia (jotka toteuttavat Comparatorin) vertaillaksemme eri jäseniä.
Kokoelmat-luokassa on toinen sort()-menetelmä ja se vaatii Comparatorin. Sort()-menetelmä kutsuu vertailemaan objektit lajittelemaan.

Jotta voimme verrata elokuvia luokituksen mukaan, meidän on tehtävä kolme asiaa:

  1. Luo luokka, joka toteuttaa Comparatorin (ja siten vertaa()-menetelmän, joka tekee vertailuTo()-toiminnon aiemmin tekemän työn.
  2. Tee esiintymä Comparator-luokasta.
  3. Kutsu ylikuormitettua sort()-metodia ja anna sille sekä luettelo että Comparatorin toteuttavan luokan esiintymä.

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; muuten palauttaa 0; } } // Vertaileva luokka Elokuvat nimen mukaan luokka NimiVertaa toteuttaa Comparator { public int vertaa(Elokuva m1, Elokuva m2) { return m1.getName().compareTo(m2.getName()); } } // Ohjainluokkaluokka 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('Jedien paluu', 8.4, 1983)); // Lajittele luokituksen mukaan : (1) Luo objekti // arvioVertaa // (2) Kutsu Collections.sort // (3) Tulosta Lajiteltu luettelo System.out.println('Lajiteltu luokituksen mukaan'); ArvioVertaa arvosanaVertaa = new ArvioiVertaa(); Kokoelmat.lajittelu(luettelo, arvosanaVertaa); for (Elokuvaelokuva : lista) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Kutsu ylikuormitettua lajittelumenetelmää RatingComparella // (Sama kolme vaihetta kuin yllä) System.out.println(' Lajiteltu nimen mukaan'); NimiVertaa nimiVertaa = new NameVertaa(); Kokoelmat.lajittelu(luettelo, nimiVertaa); for (Elokuvaelokuva : lista) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Käyttää Vertailukelpoista lajitteluun vuoden mukaan System.out.println(' Lajiteltu vuoden mukaan'); Collections.sort(list); for (Elokuvaelokuva : lista) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

>

Lähtö:

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>
  • Vertailukelpoinen on tarkoitettu kohteille, joilla on luonnollinen järjestys, mikä tarkoittaa, että esineen itsensä tulee tietää, miten se järjestetään. Esimerkiksi opiskelijoiden rullanumerot. Sen sijaan Comparator-liittymän lajittelu tapahtuu erillisen luokan kautta.
  • Loogisesti Comparable-liittymä vertaa tätä viittausta määritettyyn objektiin ja Java-vertailija vertaa kahta eri luokkaobjektia.
  • Jos jokin luokka toteuttaa Javassa Comparable-rajapinnan, niin kyseisen objektin kokoelma joko List tai Array voidaan lajitella automaattisesti käyttämällä Collections.sort()- tai Arrays.sort()-metodia ja objektit lajitellaan CompareTo-metodin määrittelemän luonnollisen järjestyksen mukaan.
  • Erottava perusominaisuus on, että käyttämällä vertailukelpoista voimme käyttää vain yhtä vertailua. Sen sijaan voimme kirjoittaa useamman kuin yhden mukautetun vertailijan haluamallasi tavalla tietylle tyypille, kaikki käyttämällä erilaisia ​​tulkintoja lajittelun merkityksestä. Kuten vertailukelpoisessa esimerkissä, voimme vain lajitella vain yhden määritteen, eli vuoden, mukaan, mutta vertailussa pystyimme käyttämään myös erilaisia ​​attribuutteja, kuten arvosanaa, nimeä ja vuotta.

Yhteenvetona voidaan todeta, että jos objektien lajittelun on perustuttava luonnolliseen järjestykseen, käytä Vertailevaa, kun taas jos lajittelu on tehtävä eri objektien attribuuttien perusteella, käytä Comparatoria Javassa.