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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

Oppsummering del 2. Læringsmål Viktigste Java-elementer Eksamen Til sist. Læringsmål Hovedpunkter Tilbakemelding Eksamen. IN1010 uke 17 våren 2019

INF1010. Stein Michael Storleer (michael) Lenkelister

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Læringsmål for forelesningen

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

Liste som abstrakt konsept/datatype

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

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

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

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

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

UNIVERSITETET I OSLO

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

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

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

INF Notater. Veronika Heimsbakk 10. juni 2012

PG4200 Algoritmer og datastrukturer Forelesning 7

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Dagens tema INF1010 INF1010 INF1010 INF1010

IN1010 våren januar. Objektorientering i Java

Inf1010 oppgavesamling

Kapittel 9: Sortering og søking Kort versjon

Inf1010 oppgavesamling

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

Del 3: Evaluere uttrykk

Sortering med Comparable og Comparator

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Algoritmer og datastrukturer E Løkker i Java

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

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

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

TOD063 Datastrukturer og algoritmer

Eksamen IN1010/INF1010 våren 2018

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

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

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

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

INF Innleveringsoppgave 6

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

UNIVERSITETET I OSLO

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

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

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

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

UNIVERSITETET I OSLO

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Stack. En enkel, lineær datastruktur

UNIVERSITETET I OSLO

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Obligatorisk oppgave 4: Lege/Resept

Lenkelister. Lister og køer.

Velkommen til INF1010

UNIVERSITETET I OSLO

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

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Kapittel 9: Sortering og søking Kort versjon

Innhold. INF1000 Høst Klasser og objekter. Uke 7: Mer objektorientert programmering Siri Moe Jensen

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Sortering med tråder - Quicksort

Gjennomgang av eksamen H99

LO191D/LC191D Videregående programmering

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

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

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Eksamen

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Studieaktiviteter i INF1010

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Kapittel 8: Sortering og søking INF100

UNIVERSITETET I OSLO

Kapittel 8: Sortering og søking INF100

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

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

INF1010 våren februar. Arv og subklasser, del 2

Programmeringsspråket C Del 3

Algoritmer og datastrukturer Eksamen

INF1010 Sortering. Marit Nybakken 1. mars 2004

Transkript:

Dagens tema Litt mer om vanlige lister Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5) Nyttige varianter av lister: Stabler («stacks») (Big Java 15.5.1) Køer («queues») (Big Java 15.5.2) Prioritetskøer («priority queues») (Big Java 15.5.3) Sammenligning av objekter (Comparable) (Big Java 9.6.3) Hvordan gå elegant gjennom en samling data Iterator-er (Big Java 15.2)

Enveislister Repetisjon: Enveislister Navn: start null

Enveislister Hvordan finne størrelsen Vi må gå gjennom listen hvis vi vil telle alle nodene: Navn: start null Node p = start; int n = 0; while (p!= null) { n++; p = p.neste;

Enveislister u Enkle å programmere u Fleksible d Kan av og til bli mye leting: Hva er bra og mindre bra med slike lister Når vi skal finne et element som ligger nær slutten av en lang liste. Når vi skal fjerne elementer nær slutten.

Toveislister Toveislister Navn: start Navn: slutt Derfor bruker noen toveislister («doubly-linked lists»): { Node neste = null; Node forrige = null; T data; Navn: forrige null Navn: forrige null Navn: forrige Node(T x) { data = x; private Node start = null; private Node slutt = null;

Toveislister Da slipper vi å lete for å fjerne siste element: Navn: start Navn: slutt Navn: forrige null Navn: forrige null Navn: forrige Node n = slutt; slutt.forrige.neste = null; slutt = slutt.forrige;

Konklusjon om en- og toveislister Når skal jeg velge toveislister 1 Når jeg ofte skal finne et av de siste elementene i en lang liste. 2 Når jeg ofte skal fjerne andre elementer enn det første i listen. Ellers er det greit å holde seg til enveislister.

En mangel ved Liste-klassen vår En mangel ved vår (og Javas) List Listene våre (og Javas) kan kun inneholde objekter og ikke primitive verdier som int, char, boolean etc. Hva kan vi gjøre med det Hva om vi lager en hjelpeklasse: public class Heltall { private int verdi; public Heltall(int i) { verdi = i; public int intvalue() { return verdi; Heltall.java

... og en løsning Da kan vi lage en liste av heltall ved å «pakke dem inn» ett og ett i objekter (såkalt «boxing»): Liste<Heltall> lx = new Lenkeliste<>(); og vi kan bruke listen som normalt: lx.add(new Heltall(12)); int v = lx.get(2).intvalue();

Java har mange slike klasser Javas klasser for innpakking Type boolean byte char double float int long short Klasse Boolean Byte Character Double Float Integer Long Short Disse klassene inneholder bl a: xxxvalue() pakker ut en boks. valueof(xxx v) pakker v inn i en boks. Nytt i Java: Bruk heller metoden Xxx.valueOf(v) enn konstruktøren new Xxx(xxx v). equals(xxx p) sjekker likhet. tostring() omformer til en tekst. parsexxx(string s) omformer fra en tekst.

Noen ganger går det automatisk Automatisk innkapsling Innkapsling fungerer bra: ArrayList<Integer> lx = new ArrayList<>(); lx.add(integer.valueof(12)); int v = lx.get(2).intvalue();... men notasjonen er litt kronglete. Derfor har nyere versjoner av Java innført litt syntaktisk sukker og tillater automatisk inn- og utkapsling for standardklassene: ArrayList<Integer> lx = new ArrayList<>(); lx.add(12); int v = lx.get(2);

Javas klasser for lagring av data Javas Collection-klasser Collection Map List Queue Set HashMap TreeMap ArrayList Stack LinkedList PriorityQueue HashSet TreeSet

LIFO = Last in, first out Stabler («stacks») En spesiell form for lister er stabler der vi kun legger nye elementer på toppen («push-er») og kun henter fra samme ende («pop-er»).

LIFO = Last in, first out Navn: start null

LIFO = Last in, first out Navn: start Legge på («push-e») null Node ny = new Node(v); ny.neste = start; start = ny; (Fungerer bra også om stabelen er tom.)

LIFO = Last in, first out Navn: start Ta av («pop-e») T svar = null; if (start!= null) { svar = start.data; start = start.neste; null

FIFO = First in, first out Køer («queues») Køer er en annen spesiell form for lister der vi alltid setter inn nye elementer bakerst og henter dem ut forrerst.

FIFO = First in, first out Navn: start Navn: slutt Sette inn i køen Node ny = new Node(v); slutt.neste = ny; slutt = ny; null (Men hva om køen var tom før vi skal sette inn) Hente ut av køen Akkurat som å pop-e en stabel.

Noe haster mer enn annet Prioritetskøer («Priority queues») I prioritetskøer haster noen elementer mer enn andre; de tas først uavhengig av hvor lenge de har stått i køen.

Prioritetskøer Hvordan programmere en prioritetskø En prioritetskø må alltid holdes sortert. Nye elementer må derfor settes på korrekt plass. Hvordan vet vi hva som er riktig sortering Vi trenger en standardtest som forteller oss om prioritetsforholdet for to elementer p og q: Er p < q Er p = q Er p > q

Interface-et Comparable interface Comparable Java-biblioteket har et interface kalt Comparable som angir at noe er sammenlignbart. Det inneholder kun én metode: Comparable.java public interface Comparable<T> { public int compareto(t otherobj); Ideen er at vårt objekt skal kunne sammenlignes med et vilkårlig annet objekt og returnere et heltall < 0 hvis vårt objekt er mindre enn det andre = 0 hvis vårt objekt er likt med det andre > 0 hvis vårt objekt er større enn det andre

Interface-et Comparable Et eksempel Deltagerland.java public class Deltagerland implements Comparable<Deltagerland> { protected String navn; protected int antgull, antsoelv, antbronse; Deltagerland(String id, int g, int s, int b) { navn = id; antgull = g; antsoelv = s; antbronse = b; @Override public int compareto(deltagerland a) { if (antgull < a.antgull) return -1; if (antgull > a.antgull) return 1; if (antsoelv < a.antsoelv) return -1; if (antsoelv > a.antsoelv) return 1; if (antbronse < a.antbronse) return -1; if (antbronse > a.antbronse) return 1; return 0;

Interface-et Comparable Et testprogram TestMedaljer.java estmedaljer { public static void main(string[] args) { Deltagerland danmark = new Deltagerland("Danmark", 0, 0, 0), finland = new Deltagerland("Finland", 1, 1, 4), island = new Deltagerland("Island", 0, 0, 0), norge = new Deltagerland("Norge", 14, 14, 11), sverige = new Deltagerland("Sverige", 7, 6, 1); System.out.println("Finland vs Sverige: " + finland.compareto(sverige)); System.out.println("Norge vs Sverige: " + norge.compareto(sverige)); System.out.println("Danmark vs Sverige: " + danmark.compareto(sverige)); System.out.println("Danmark vs Island: " + danmark.compareto(island)); Finland vs Sverige: -1 Norge vs Sverige: 1 Danmark vs Sverige: -1 Danmark vs Island: 0

Interface-et Comparable Et testprogram til Når en klasse implementerer Comparable, vet Java nok til å kunne sortere den effektivt: import java.util.arrays; TestMedaljer2.java estmedaljer2 { public static void main(string[] args) { Deltagerland[] land = { new Deltagerland("Danmark", 0, 0, 0), new Deltagerland("Finland", 1, 1, 4), new Deltagerland("Island", 0, 0, 0), new Deltagerland("Norge", 14, 14, 11), new Deltagerland("Sverige", 7, 6, 1) ; Danmark Island Finland Sverige Norge Arrays.sort(land); for (int i = 0; i < land.length; i++) System.out.println(land[i].navn);

Hvordan programmere en prioritetskø Implementasjon av en prioritetskø Vi kan lage prioritetskø som en spesialisering av Arrayliste. [] Navn: ibruk Type: int 1 0 1 2 3 4 class Arrayliste []

Hvordan programmere en prioritetskø Rammen for en prioritetskø basert på Arrayliste kan se slik ut: public class ArrayPrioKoe<T extends Comparable<T>> extends Arrayliste<T> { @Override public void add(t x) { Kommentarer Klassen ArrayPrioKoe er en subklasse av Arrayliste. Klasseparameteren T må være en implementasjon av Comparable så vi får en sammenligning å sortere etter. Vi redefinerer kun metoden add siden innsettingen skal gjøres sortert. De øvrige metodene i Arrayliste kan brukes som de er.

Hvordan programmere en prioritetskø Når vi skal programmere add, må vi tenke på alle mulige situasjoner: 1 Listen kan være tom fra før av. 2 Hvis ikke, må vi lete oss frem til første element i listen som er større enn det vi skal sette inn. Da må vi flytte det elementet og alle de resterende ett hakk lenger ut. Så kan vi sette inn det nye elementet på rett plass. 3 Hvis alle elementene i listen er mindre eller lik det nye elementet, må det nye elementet settes bakerst.

Hvordan programmere en prioritetskø public class ArrayPrioKoe<T extends Comparable<T>> extends Arrayliste<T> { @Override public void add(t x) { if (size() == 0) { // Listen er tom, så sett inn det nye elementet: super.add(x); return; for (int i = 0; i < size(); i++) { if (get(i).compareto(x) > 0) { // Vi har funnet et element som er større enn det nye. // Flytt det og etterfølgende elementer ett hakk opp. super.add(null); // Utvid arrayen for (int ix = size()-2; ix >= i; ix--) set(ix+1, get(ix)); // Sett inn det nye elementet: set(i, x); return; // Det nye elementet er størst og skal inn bakerst: super.add(x);

Hvordan programmere en prioritetskø Et testprogram estprio { public static void main(string[] args) { Liste<String> ap = new ArrayPrioKoe<>(); ap.add("ellen"); ap.add("stein"); ap.add("siri"); ap.add("dag"); ap.add("anne Berit"); ap.add("irene"); for (int i = 0; i < ap.size(); i++) System.out.println(ap.get(i)); Anne Berit Dag Ellen Irene Siri Stein

Hvordan gå gjennom en liste på en elegant måte Å gå gjennom en Liste Vi kan gå gjennom en liste ved å hente elementene ett for ett: Liste<String> lx = new Arrayliste<>(); for (int i = 0; i < lx.size(); i++) System.out.println(lx.get(i)); En bedre notasjon Det hadde vært fint å kunne skrive bare for (String s: lx) System.out.println(s); og slippe å tenke på hva som er grensesnittet (size og get).

Interface Iterator Javas interface Iterator En slik elegant gjennomgang er mulig med en iterator: public interface<t> Iterator { boolean hasnext(); T next(); En iterator holder orden på hvor langt vi er kommet i gjennomgangen og kan gi oss elementene ett for ett.

Interface Iterator For Arrayliste trenger vi en teller og en referanse til listen: Navn: minliste Type: Liste Navn: indeks [] 0 0 Type: int hasnext() Navn: ibruk Type: int 1 1 2 3 next() 4 class Arrayliste [] class ListeIterator

Interface Iterator import java.util.iterator; ListeIterator.java class ListeIterator<T> implements Iterator<T> { private Liste<T> minliste; private int indeks = 0; public ListeIterator(Liste<T> lx) { minliste = lx; @Override public boolean hasnext() { return indeks < minliste.size(); @Override public T next() { return minliste.get(indeks++);

Interface Iterable Interface-et Iterable forteller at det finnes en tilhørende Iterator: Liste.java interface Liste<T> extends Iterable <T> { int size(); void add(t x); void set(int pos, T x); T get(int pos); T remove(int pos); Så må vi lage en metode iterator (med liten forbokstav) som skaffer oss et Iterator-objekt (med stor forbokstav). Arrayliste.java class Arrayliste<T> implements Liste<T> { public ListeIterator<T> iterator() { return new ListeIterator<T>(this);