Sortering med Comparable og Comparator

Like dokumenter
Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Kapittel 9: Sortering og søking Kort versjon

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

INF1010 Binære søketrær ++

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

INF1010. Stein Michael Storleer (michael) Lenkelister

INF1010. Grensesnittet Comparable<T>

Repitisjonskurs. Arv, Subklasser og Grensesnitt

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

Eksamen Oppgave a) public class DayTime { public final int hours, minutes;

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

PRIORITETSKØ. Aksjehandel. Datastruktur for aksjehandel. Nøkler og Totalorden-relasjonen

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

EKSAMEN. Objektorientert programmering

Løsningsforslag Test 2

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 2. juni 2006 Kl

Kap.8 Sortering og søking sist oppdatert 16.03

TDT4100 Objektorientert programmering

Obligatorisk oppgave 4: Lege/Resept

Algoritmer og datastrukturer Eksamen

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Klasser og objekter. Tuva Kristine Thoresen 22. oktober Institutt for Informatikk

Introduksjon til objektorientert programmering

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Kontinuasjonseksamensoppgave i TDT4100 Objektorientert programmering

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

UNIVERSITETET I OSLO

Liste som abstrakt konsept/datatype

TDT4100 Objektorientert programmering

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

Eksamen Objektorientert Programmering 2011

2 Om statiske variable/konstanter og statiske metoder.

Emnenavn: Objektorientert programmering. Faglærer: Lars Emil Knudsen

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Eksamen Objektorientert Programmering 2013

IN1010 våren januar. Objektorientering i Java

Eksamensoppgaver 2014

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1000 Eksamen 2014 (modifisert)

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF1010 notat: Binærsøking og quicksort

INF106 Objektorientert programmering

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

INF1000 Prøveeksamen Oppgave 7 og 9

TDT4100 Objektorientert programmering

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

import java.util.arraylist;

Test 2 OOP. - Prøveeksamen

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 våren Grensesnitt

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

EKSAMEN. Emne: Algoritmer og datastrukturer

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

LC191D/LO191D Videregående programmering mai 2010

INF1010 våren januar. Objektorientering i Java

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Seminaroppgaver IN1010, uke 2

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

/** *Kamp klassen inneholder kampfakte og hoveddelen av kampmotoren. young */

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Transkript:

Sortering med Comparable og Comparator Denne siden forklarer hvordan grensesnittene java.util.comparable og java.util.comparator bidrar til sortering i Java. Comparable og Comparator er grensesnitt som lar deg bestemme hvordan dine egne objekter skal rangeres i forhold til hverandre ved sortering. Dette kommer spesielt godt til nytte når man bruker Collection-rammeverket, spesielt metoden Collections.sort. Disse grensesnittene krever én metode hver, henholdsvis compareto(t o) og Compare(T o1, T o2) hvor T er klassen som skal rangeres/sammenlignes. Comparable<T> Comparable er ment å blir implementert av klassen som holder dataene som skal rangeres/sammenlignes. 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" regnes som mindre enn argumentet (instans av samme klasse), 0 hvis de regnes som like, og et positivt tall dersom "this" regnes som er større enn argumentet. Sett at du har en klasse som definerer et Land som deltar i OL. Klassen har felter for antall gull, sølv og bronsje. For at du skal kunne avgjøre hvilket land som kommer høyest opp på medaljerangeringen trenger man en metode for å avgjøre dette. OlympicCountry

public class OlympicCountry implements Comparable<OlympicCountry> { //inne i klammene defineres hvilken klasse som skal sammenlignes i compareto-metoden private String name; private int goldmedals; private int silvermedals; private int bronzemedals; public OlympicCountry(String name, int goldmedals, int silvermedals, int bronzemedals) { this.name = name; this.goldmedals = goldmedals; this.silvermedals = silvermedals; this.bronzemedals = bronzemedals; // gettere public int getgoldmedals() { return goldmedals; public int getsilvermedals() { return silvermedals; public int getbronzemedals() { return bronzemedals; public String tostring(){ return name + ": "+ goldmedals + "-" + silvermedals + "-" + bronzemedals; public int compareto(olympiccountry o) { if (this.getgoldmedals()!= o.getgoldmedals()) // hvis gull er ulike, returnerer deres forskjell return this.getgoldmedals() - o.getgoldmedals(); else if (this.getsilvermedals()!= o.getsilvermedals()) //hvis sølv er ulike, returneres deres forskjell return this.getsilvermedals() - o.getsilvermedals(); else return this.getbronzemedals() - o.getbronzemedals(); // hvis den er kommet hit er gull og sølv like, da returnerer den bronsje-forskjellen. Om den også er lik returneres 0, som indikerer at instansene er like gode. OlympicCountry china = new OlympicCountry("China", 2, 4, 1); OlympicCountry japan = new OlympicCountry("Japan", 2, 5, 1); System.out.println(china.compareTo(Japan)); // printer ut -1. Dette betyr at Japan er bedre enn Kina.

Så hvorfor er dette så fantastisk. Jo, som nevnt over så kan man bruke det i forbindelse med sortering. Collections.sort() krever bare at du sender med en liste med objekter som implementerer Comparable-grensesnittet. Her ser dere en ny main-metode som bruker den allerede definerte OlympicCountry-klassen. List<OlympicCountry> countries = new ArrayList<OlympicCountry>(Arrays.asList( new OlympicCountry("Norway", 5, 3, 7), new OlympicCountry("Sweden", 2, 9, 3), new OlympicCountry("Finland", 9, 2, 1), new OlympicCountry("Russia", 2, 9, 12), new OlympicCountry("Denmark", 7, 1, 6), new OlympicCountry("England", 5, 2, 10), new OlympicCountry("Canada", 5, 0, 4), new OlympicCountry("USA", 9, 2, 2) )); Printer ut: [Norway: 5-3-7, Sweden: 2-9-3, Finland: 9-2-1, Russia: 2-9-12, Denmark: 7-1-6, England: 5-2-10, Canada: 5-0-4, USA: 9-2-2] Altså usortert, men ettersom OlympicCountry-klassen implementerer Comparable kan vi nå sortere instansene slik vi ønsker. Collections.sort(countries); [Sweden: 2-9-3, Russia: 2-9-12, Canada: 5-0-4, England: 5-2-10, Norway: 5-3-7, Denmark: 7-1-6, Finland: 9-2-1, USA: 9-2-2] Nå kan dere se at listen er sortert, men den er fortsatt ikke slik vi ønsker den, selv om compareto-metoden er helt rett. Les neste avsnitt for løsningen. Comparator<T> Problemet over er at sorteringsalgoritmen automatisk sorterer i stigende rekkefølge. En enkel løsning ville vært å bytte om på objektene i co mpareto() -metoden, men dette ville vært feil ettersom Comparable skal gjenspeile klassens naturlige ordning og kan derfor ikke tilpasses et spesielt problem. Løsningen er å bruke en Comparator, som i motsetning til Comparable, er ment å 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 sendes den enkelt med som et andre argument til kallet til Collections.sort(). Comparator-grensesnittet krever at du har implementert metoden compare(o1,o2). Denne har samme logikk for returverdien som compareto(), men tar en inn to argumenter istedet for at et argument sammenlignes med "this".

Comparator public class MedalComparator implements Comparator<OlympicCountry> { //spesifiser hvilken klasse som skal sammenlignes som vanlig private boolean descending; // laget en custom konstruktør hvor du kan bestemme om du vil rangere stigende eller synkende public MedalComparator(boolean descending) { this.descending = descending; // her sammenlignes to instanser med hverandre public int compare(olympiccountry o1, OlympicCountry o2) { OlympicCountry a = (descending? o2 : o1); OlympicCountry b = (descending? o1 : 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-implementasjon. Under kan du se hvordan den brukes i en main-metode, som også har referanser til den allerede definerte OlympicCountry-klassen.

Using Comparator in ArrayList List<OlympicCountry> countries = new ArrayList<OlympicCountry>(Arrays.asList( new OlympicCountry("Norway", 5, 3, 7), new OlympicCountry("Sweden", 2, 9, 3), new OlympicCountry("Finland", 9, 2, 1), new OlympicCountry("Russia", 2, 9, 12), new OlympicCountry("Denmark", 7, 1, 6), new OlympicCountry("England", 5, 2, 10), new OlympicCountry("Canada", 5, 0, 4), new OlympicCountry("USA", 9, 2, 2) )); Collections.sort(countries, new MedalComparator(true)); Her printes det nå: [USA: 9-2-2, Finland: 9-2-1, Denmark: 7-1-6, Norway: 5-3-7, England: 5-2-10, Canada: 5-0-4, Russia: 2-9-12, Sweden: 2-9-3] Det anbefales å lese dokumentasjonen som er linket til 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 å la klassen som skal sorteres implementere Co mparable. Sidetype Ferdig Teori 90