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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Læringsmål for forelesningen

INF1010. Stein Michael Storleer (michael) Lenkelister

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)

UNIVERSITETET I OSLO

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

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

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

PG4200 Algoritmer og datastrukturer Forelesning 7

INF Notater. Veronika Heimsbakk 10. juni 2012

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

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

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Kapittel 9: Sortering og søking Kort versjon

IN1010 våren januar. Objektorientering i Java

Inf1010 oppgavesamling

Dagens tema INF1010 INF1010 INF1010 INF1010

Del 3: Evaluere uttrykk

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Inf1010 oppgavesamling

UNIVERSITETET I OSLO

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

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

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

Algoritmer og datastrukturer E Løkker i Java

Eksamen IN1010/INF1010 våren 2018

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

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Sortering med Comparable og Comparator

UNIVERSITETET I OSLO

INF Innleveringsoppgave 6

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

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

Løsningsforslag til eksamen i INF1000 våren 2006

Obligatorisk oppgave 4: Lege/Resept

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

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

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

UNIVERSITETET I OSLO

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

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

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

Kapittel 9: Sortering og søking Kort versjon

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

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

UNIVERSITETET I OSLO

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

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

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

LO191D/LC191D Videregående programmering

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

Kapittel 8: Sortering og søking INF100

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

Kapittel 8: Sortering og søking INF100

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

TOD063 Datastrukturer og algoritmer

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Læringsmål for forelesningen

UNIVERSITETET I OSLO

Kapittel 8: Sortering og søking

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

INF1010 våren Arv og subklasser del 1

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

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

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

Stack. En enkel, lineær datastruktur

Løsningsforslag eksamen INF1020 høsten 2005

Algoritmer og Datastrukturer

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

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

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

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF Løsning på seminaropppgaver til uke 8

UNIVERSITETET I OSLO

Sortering med tråder - Quicksort

INF Seminaroppgaver til uke 3

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

Algoritmer og datastrukturer Eksamen

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Lenkelister. Lister og køer.

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 Navn: neste Navn: neste Navn: neste null Type: T class Node Type: T class Node Type: T class Node???

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»): class Node { Node neste = null; Node forrige = null; T data; Navn: neste Navn: forrige null Navn: neste Navn: forrige Navn: neste null Navn: forrige Node(T x) { data = x; private Node start = null; private Node slutt = null; Type: T class Node Type: T class Node Type: T class Node???

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

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, men har en litt kronglete notasjon: Liste<Integer> lx = new Lenkeliste<>(); lx.add(integer.valueof(12)); int v = lx.get(2).intvalue(); 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 Navn: neste Navn: neste Navn: neste null Type: T class Node Type: T class Node Type: T class Node???

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: neste Navn: neste Navn: neste null Type: T class Node Type: T class Node Type: T class Node???

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 { public abstract int compareto(object 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 Medaljeoversikt.java public class Medaljeoversikt implements Comparable { protected String navn; protected int antgull, antsoelv, antbronse; Medaljeoversikt(String id, int g, int s, int b) { navn = id; antgull = g; antsoelv = s; antbronse = b; public int compareto(object annet) { Medaljeoversikt m = (Medaljeoversikt)annet; if (antgull < m.antgull) return -1; if (antgull > m.antgull) return 1; if (antsoelv < m.antsoelv) return -1; if (antsoelv > m.antsoelv) return 1; if (antbronse < m.antbronse) return -1; if (antbronse > m.antbronse) return 1; return 0;

Interface-et Comparable Et testprogram TestMedaljer.java estmedaljer { public static void main(string[] args) { Medaljeoversikt danmark = new Medaljeoversikt("Danmark", 0, 0, 0), finland = new Medaljeoversikt("Finland", 1, 1, 4), island = new Medaljeoversikt("Island", 0, 0, 0), norge = new Medaljeoversikt("Norge", 14, 14, 11), sverige = new Medaljeoversikt("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) { Medaljeoversikt[] land = { new Medaljeoversikt("Danmark", 0, 0, 0), new Medaljeoversikt("Finland", 1, 1, 4), new Medaljeoversikt("Island", 0, 0, 0), new Medaljeoversikt("Norge", 14, 14, 11), new Medaljeoversikt("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. Type: T[] Navn: ibruk Type: int 1 0 1 2 3 4 class Arrayliste Type: T[]

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 Arratliste 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 opp. 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 { public abstract boolean hasnext(); public 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 Type: T[] 0 0 Type: int hasnext() Navn: ibruk Type: int 1 1 2 3 next() 4 class Arrayliste Type: T[] 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; public boolean hasnext() { return indeks < minliste.size(); 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> { public abstract int size(); public abstract void add(t x); public abstract void set(int pos, T x); public abstract T get(int pos); public abstract 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 iterator() { return new ListeIterator(this);