Gyakorlati alapok III.
A Comparator interfész
Az
előző fejezetünkben
már felhasználtuk compareTo() függvényünket,
amelynek emlékeztetőül visszatérési értékei kötelezően a következők...
-
-1 - ha az objektum kisebb,
-
0 - ha objektum egyenlő,
-
1 - ha az objektum nagyobb,
...illetve további, specifikus jellemzője, hogy csupán egyetlen bemeneti paramétert vár (public int compareTo(obj)).
A Comparator interfész szintén egyetlen compareTo() metódust tartalmaz, ám már 2 db bemeneti paramétert vár: (public int compareTo(obj1, obj2).
Példakódunk ezúttal jóval komplexebbnek ígérkezik, ha a feladat többféle rendezési szempont megalkotása, hiszen ekkor a compareTo() függvényt többször is fel kell használnunk.
Legyen egy könyvlistánk, amely 3 elemet: könyvcímet, kiadási évet és a Facebook-on elérhető lájkszámot, mint népszerűségi mutatót tartalmazza:
-
String nev,
-
int kiadasiEv,
-
int likeSzam.
Ha mindhárom attribútumra szükséges összehasonlító rutint kell írnunk, akkor a Comparable.compareTo() metódus már nem lesz elég a megoldáshoz. A különálló rendezési szempontokat különálló osztályokba kell tennünk, ezzel tehát visszakanyarodtunk a "klasszikus" objektumorientált szemlélethez (ennek további részei lesznek a getter-setter függvények és a konstruktor megjelenése). Ezt persze az előző fejezetben is megtehettük volna, ám ebben az esetben túlbonyolítjuk az alapkódot, amely nem lehet célja egy oktatási anyagnak. Ezt azonban most már nem tudjuk megkerülni, mert több compareTo() metódus kell, ráadásul néhány esetben 2 db bemeneti paraméterrel.
Konyv.java
import java.util.*;
class Konyv implements Comparable<Konyv>{
private int likeSzam;
private String nev;
private int kiadasiEv;
public int getlikeSzam(){
return likeSzam;
}
public String getNev(){
return nev;
}
public int getkiadasiEv(){
return kiadasiEv;
}
public Konyv(String nev, int likeSzam, int kiadasiEv) {
this.nev = nev;
this.likeSzam = likeSzam;
this.kiadasiEv = kiadasiEv;
}
public int compareTo(Konyv konyv) {
return this.kiadasiEv - konyv.kiadasiEv;
}
}
RendezesLikeSzam.java
import java.util.*;
class RendezesLikeSzam implements Comparator<Konyv>{
public int compare(Konyv konyv1, Konyv konyv2) {
if (konyv1.getlikeSzam() < konyv2.getlikeSzam()) {
return -1;
}
if (konyv1.getlikeSzam() > konyv2.getlikeSzam()) {
return 1;
}
else return 0;
}
}
RendezesNev.java
import java.util.*;
class RendezesNev implements Comparator<Konyv>{
public int compare(Konyv konyv1, Konyv konyv2) {
return konyv1.getNev().compareTo(konyv2.getNev());
}
}
Main.java
import java.util.*;
class Main {
public static void main(String[] args) {
ArrayList<Konyv> konyvlista = new ArrayList<Konyv>();
konyvlista.add(new Konyv("Háború és béke", 16500, 1869));
konyvlista.add(new Konyv("Bűn és bűnhődés", 12431, 1866));
konyvlista.add(new Konyv("Öreg halász és a tenger", 9850,
1952));
konyvlista.add(new Konyv("Árvácska", 8311, 1941));
konyvlista.add(new Konyv("Egri csillagok", 8500, 1899));
System.out.println("Rendezés név alapján:");
RendezesNev rendezesNev = new RendezesNev();
Collections.sort(konyvlista, rendezesNev);
for(Konyv k: konyvlista) {
System.out.println(k.getNev() + " - "
+ k.getlikeSzam() + " - " + k.getkiadasiEv());
}
System.out.println("\nRendezés kiadási év alapján:");
Collections.sort(konyvlista);
for(Konyv k: konyvlista) {
System.out.println(k.getkiadasiEv() +
" - " + k.getlikeSzam() + " - " + k.getNev()+" ");
}
System.out.println("\nRendezés likeszám alapján:");
RendezesLikeSzam rendezesLikeSzam = new RendezesLikeSzam();
Collections.sort(konyvlista, rendezesLikeSzam);
for(Konyv k: konyvlista) {
System.out.println(k.getlikeSzam() +
" - " + k.getNev() + " - " + k.getkiadasiEv());
}
}
}
Végeredmény:
Rendezés név alapján:
Bűn és bűnhődés - 12431 - 1866
Egri csillagok - 8500 - 1899
Háború és béke - 16500 - 1869
Árvácska - 8311 - 1941
Öreg halász és a tenger - 9850 - 1952
Rendezés kiadási év alapján:
1866 - 12431 - Bűn és bűnhődés
1869 - 16500 - Háború és béke
1899 - 8500 - Egri csillagok
1941 - 8311 - Árvácska
1952 - 9850 - Öreg halász és a tenger
Rendezés likeszám alapján:
8311 - Árvácska - 1941
8500 - Egri csillagok - 1899
9850 - Öreg halász és a tenger - 1952
12431 - Bűn és bűnhődés - 1866
16500 - Háború és béke - 1869