Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Completed the Comparator part

...

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
languagejava
titleComparator
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
languagejava
titleUsing Comparator in ArrayList
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().

 

 

SidetypeFerdig
Teori5090