...
Comparable og Comparator er interfaces som lar deg bestemme hvordan dine egne objekter skal rangeres i forhold til hverandre. Dette kommer spesielt godt til nytte når man bruker Collection-rammeverket, spesielt metoden Collections.sort. Disse interfacene krever en metode hver, henholds vis Compare(T o1, T o2) og compareTo(T o) hvor T er klassen som skal sammenlignes.
Comparable<T>
Comparable er det vanlig at klassen din implementerer. Den krever at du har definert metoden .compareTo(T), hvor T er klassen som skal sammenlignes. CompareTo metoden skal returnere et Negativt tall hvis "this" er mindre enn det andre instanse. 0 hvis de er like, og et positivt tall dersom "this" er større enn det andre instanset.
...
Problemet over er at sorteringsalgoritmen automatisk sorterer i stigende rekkefølge. En enkel fiks ville vært å bytte om på objektene i compareTo()-metoden, men dette ville vært feil ettersom Comparable skal gjenspeile klassens naturlige ordning, og kan derfor ikke tilpasses for et spesielt problem. Løsningen er å bruke en Comparator. I motsetning til Comparable , så er Comparator tiltenkt å implementeres av en annen klasse enn den som skal sorteres. Den kan da også ha friere regler på utfallet av sammenligninger. For å bruke en comparator Comparator sendes den enkelt med som et andre argument til Collections.sort() kallet. Comparator-interfacet krever at du har metoden compare(o1,o2). Denne fungerer på samme måte som compareTo(), men tar en inn to argumenter istedet for at et argument sammenlignes med "this"
Code Block | ||||
---|---|---|---|---|
| ||||
public class MedalComparer implements Comparator<OlympicCountry>{ //spesifiser hvilken klasse som skal sammenlignes som vanlig
private boolean ascending;
private boolean descending;
//laget en custom constructor hvor du kan bestemme om du vil rangere stigende eller synkende
public MedalComparer(String order){
ascending = order.toUpperCase().equals("ASCENDING");
descending = order.toUpperCase().equals("DESCENDING");
}
//her sammenlignes to eksterne instanser med hverandre
@Override
public int compare(OlympicCountry o1, OlympicCountry o2) {
OlympicCountry a;
OlympicCountry b;
//denne if-løkken tilegner objektene til a eller b, ettersom om man vil ha rangeringen stigende eller synkende
if(descending){
a = o2;
b = o1;
}
else{
a = o1;
b = o2;
}
//denne delen er helt lik som compareTo() metoden, a tilsvarer "this" og b tilsvarer "other"
if(a.getGoldMedals() != b.getGoldMedals())
return a.getGoldMedals() - b.getGoldMedals();
else if(a.getSilverMedals() != b.getSilverMedals())
return a.getSilverMedals() - b.getSilverMedals();
else
return a.getBronzeMedals() - b.getBronzeMedals();
}
} |
Ovenfor ser du hvordan en enkel Comparator klasse. Under kan du se hvordan den brukes i en main-metode, som også har referanser til den allerede definerte OlympicCountry-klassen og print metoden, som du finner litt lenger oppe.
Code Block | ||||
---|---|---|---|---|
| ||||
public static void main(String[] args) { ArrayList<OlympicCountry> countries = new ArrayList<OlympicCountry>(); countries.add(new OlympicCountry("Norway", 5, 3, 7)); countries.add(new OlympicCountry("Sweden", 2, 9, 3)); countries.add(new OlympicCountry("Finland", 9, 2, 1)); countries.add(new OlympicCountry("Russia", 2, 9, 12)); countries.add(new OlympicCountry("Denmark", 7, 1, 6)); countries.add(new OlympicCountry("England", 5, 2, 10)); countries.add(new OlympicCountry("Canada", 5, 0, 4)); countries.add(new OlympicCountry("USA", 9, 2, 2)); Collections.sort(countries,new MedalComparer("descending")); print(countries); /* Her printes det nå: USA : g: 9, s: 2, b: 2 Finland : g: 9, s: 2, b: 1 Denmark : g: 7, s: 1, b: 6 Norway : g: 5, s: 3, b: 7 England : g: 5, s: 2, b: 10 Canada : g: 5, s: 0, b: 4 Russia : g: 2, s: 9, b: 12 Sweden : g: 2, s: 9, b: 3 */ } |
Det anbefales og lese dokumentasjonen som er linket i innledningen for å forstå hvordan java forventer at metodene skal fungere. Forskjellen er ikke så stor. Er du i tvil om hva du skal bruke vil det i de fleste tilfeller fungere og la klassen som skal sorteres implementere Comparable().
Sidetype | Ferdig |
---|---|
Teori | 5090 |