Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Like dokumenter
Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

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

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

Læringsmål for forelesningen

UNIVERSITETET I OSLO

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

IN1010 våren januar. Objektorientering i Java

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

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 våren 2017 Onsdag 25. januar. Litt om unntak i Java

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

INF1010. Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

Fra Python til Java, del 2

Liste som abstrakt konsept/datatype

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

INF Innleveringsoppgave 6

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

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Algoritmer og datastrukturer E Løkker i Java

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

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

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

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

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

UNIVERSITETET I OSLO

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

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Post-it spørsmål fra timen (Arv og subklasser)

Kapittel 8: Programutvikling

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

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

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

INF 1010, vår 2005 Løsningsforslag uke 11

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

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

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

UNIVERSITETET I OSLO

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

Jentetreff INF1000 Debugging i Java

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

TOD063 Datastrukturer og algoritmer

Løsningsforslag Test 2

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Introduksjon til objektorientert programmering

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

UNIVERSITETET I OSLO

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

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

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

2 Om statiske variable/konstanter og statiske metoder.

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

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

GUI («Graphical User Interface») del 2

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF1010 våren januar. Objektorientering i Java

IN våren 2018 Tirsdag 16. januar

UNIVERSITETET I OSLO

GUI («Graphical User Interface») del 2

IN våren 2019 Onsdag 16. januar

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

UNIVERSITETET I OSLO

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

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Del 3: Evaluere uttrykk

Generiske mekanismer i statisk typede programmeringsspråk

Enkle generiske klasser i Java

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

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar I dag skal vi undersøke en rekke velkjente databeholdere i Java:

Gjennomgang av eksamen H99

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

2 Om statiske variable/konstanter og statiske metoder.

INF Uke 10. Ukesoppgaver oktober 2012

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF våren 2017

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

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

Innhold uke 9. Objektorientert programmering i Python. Om ukens pensum. Referanser og objekter Tema: Mer komplekse strukturer

Oppgave 1. Sekvenser (20%)

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Transkript:

Dagens tema Lister og generiske klasser, del I Array-er og ArrayList (Big Java 6.1 & 6.8) Ulike lagringsformer (Collection) i Java (Big Java 15.1) Klasser med typeparametre («generiske klasser») (Big Java 18) Lage vår egen ArrayList (Big Java 16.2) Lenkelister (Big Java 15.2)

Hvorfor er dette pensum i IN1010? Det er nyttige verktøy å kjenne til. Som eksperter bør dere kjenne til hvordan de er bygget opp og fungerer i detalj. Dere skal være i stand til å skrive lignende selv. Dette er ypperlige eksempler på oo-programmering.

Hva er en array Array-er 0 Navn: a Type: String[] 1 2 3 En array er en sammenhengende gruppe celler i minnet. 4 Type: String[]

Hva er en array Hva er bra og mindre bra med arrayer? u En god notasjon: kompakt og lettforståelig: a[i] = a[i+1] + "*"; u Tar liten plass u Raske Men... Vi må vite størrelsen når arrayen opprettes. Størrelsen er uforanderlig. d Kronglete å legge til nye verdier midt i arrayen.

Hva er så en ArrayList? ArrayList-er void add(string) void set(int,string) Navn: a Type: ArrayList<String> String get(int) int size() ArrayList er en klasse i Java-biblioteket. Grensesnittet er gitt men implementasjonen er ukjent.? class ArrayList

Hva er så en ArrayList? Er ArrayList noen ganger bedre enn arrayer? u Vi trenger ikke vite størrelsen initielt. u Størrelsen kan endres underveis. u Enkelt å legge til nye elementer hvor som helst. Men... d Notasjonen er litt kronglete: a.set(i, a.get(i+1) + "*"); Ikke for primitive typer som int, char etc. 1 Tar mye mer plass. d Er langsommere i bruk. 1 Men innkapsling er en løsning. Vi kommer til det neste uke.

Hva gjør man i Python? Hva gjør man i Python? I Python har man valgt å bruke lister som er en mellomløsning: Enkel notasjon (som Javas arrayer) u Fleksibel størrelse (som Javas ArrayList) d Ikke så rask

Litt om plassbehov Er plassforbruket viktig? Stort sett er programmets plassforbruk helt uvesentlig, men det finnes unntak: Hvis man trenger ekstremt mange objekter Hvis datamaskinen har veldig lite minne (f eks «Internet of things») Hvis hastigheten er avgjørende Konklusjon: Dette må vurderes når man starter et prosjekt.

Litt om hastighet Betyr hastighet noe? En sammenligning basert på et program som bruker Javas arrayer og ArrayList og Pythons lister aktivt: Java array Java ArrayList Python liste 1,77 s 5,66 s 155,32 s Oftest er programmets kjøretid ikke spesielt viktig, men det finnes unntak: Når jobben er spesielt stor og tung Når man trenger øyeblikkelig respons Konklusjon: Dette må vurderes når man starter et prosjekt.

Hva er best av array og ArrayList Hva bør jeg velge i Java? Velg array hvis du vet størrelsen på arrayen når den skal opprettes eller hastighet er viktig eller plass er viktig. Velg ArrayList ellers.

Java støtter mange ulike former for datalagring Datalagring i Java Java-biblioteket tilbyr mange ulike former for lagring av data: Collection Map List Queue Set HashMap TreeMap ArrayList Stack LinkedList PriorityQueue HashSet TreeSet

Java støtter mange ulike former for datalagring Collection er en samling av alle lagringsformene. List er en sekvensiell samling. ArrayList er en List implementert med en array. Stack ser på elementene som en stakk. LinkedList er en List implementert som en lenkeliste. Queue lagrer i køordning. PriorityQueue lagrer i en sortert kø. Set lagrer uten noen rekkefølge. HashSet lagrer et Set ved å bruke hash-verdier. TreeSet lagrer et Set i et tre. Map lagrer par av nøkkel+verdi. HashMap lagrer en Map ved hjelp av hash-verdier. TreeMap lagrer en Map i et tre.

Dokumentasjon er uvurderlig! Dokumentasjon av Java-biblioteket https://docs.oracle.com/javase/8/docs/api/index.html? overview-summary.html er en ypperlig dokumentasjon:

La oss lage våre egne lister La oss lage en liste Før vi starter programmeringen, må vi bestemme oss for hvilke operasjoner vi ønsker oss. Hva trenger vi i en lineær lagringsstruktur? get henter et element fra en gitt posisjon. add utvider listen med et nytt element. set erstatter elementet i et gitt posisjon med et nytt. remove fjerner elementet i en gitt posisjon. size forteller hvor lang listen vår er nå.

La oss starte med grensesnittet Start med grensesnittet Det er ofte nyttig å starte med å definere grensesnittet i form av et interface: interface Liste { int size(); void add(??? x); void set(int pos,??? x);??? get(int pos);??? remove(int pos); Liste.java

Men, hva skal vi lagre? Problem: hva skal vi lagre? Vi ønsker å lagre objekter av mange ulike klasser i listen vår. Hvordan kan vi angi det? Én mulig løsning: Object-er I Java er klassen Object superklassen til alle klasser, enten direkte eller via andre klasser. Følgelig kan en Object-referanse peke på absolutt alle objekter.

En løsning med Object-er En mulig løsning: interface Liste { int size(); void add(object x); void set(int pos, Object x); Object get(int pos); Object remove(int pos); Liste.java En halvgod løsning u Den virker. Men... d Kronglete notasjon siden vi må typekonvertere: lx.set(10, ((String)lx.get(10))+"*");

Når metoder kan ha parametre, kan ikke klasser også? Klasseparametre Vi ønsker å lage for eksempel lister av Lege-er lister av Resept-er lister av String-er Da hadde det vært fint om vi kunne ha Lege, Resept, String etc som parameter til Liste-ne våre, på samme måte som verdier kan være parametre til metoder.

Et interface med parametre En løsning Java har klasseparametre (også kalt generiske klasser eller «generics»): interface Liste<T> { int size(); void add(t x); void set(int pos, T x); T get(int pos); T remove(int pos); Liste.java

La oss lagre referansene i en array En løsning med array Vi skal lagre referansene våre i en array: Type: T[] Navn: ibruk Type: int 0 0 1 2 3 4 class Arrayliste Type: T[]

La oss lagre referansene i en array Så kan vi legge nye elementer inn i arrayen: Type: T[] Navn: ibruk Type: int 1 0 1 2 3 4 class Arrayliste Type: T[]

Koden starter slik: Klassen Arrayliste Programkoden starter slik: Arrayliste.java class Arrayliste<T> implements Liste<T> { private T[] data = new T[10]; private int ibruk = 0; Men dette fungerer ikke?! $ javac Arrayliste.java Arrayliste.java:3: error: generic array creation private T[] data = new T[10]; ^ 1 error

Java er ikke perfekt! En feil i Java! Denne feilen er egentlig en feil i Java selv! En løsning som fungerer Heldigvis finnes det en nødutvei: Arrayliste.java class Arrayliste<T> implements Liste<T> { @SuppressWarnings("unchecked") private T[] data = (T[])new Object[10]; private int ibruk = 0; (Løsningen ville normalt gitt en advarsel, men vi slår av den.)

Da setter vi i gang Klassen Arrayliste Arrayliste.java class Arrayliste<T> implements Liste<T> { @SuppressWarnings("unchecked") private T[] data = (T[])new Object[10]; private int ibruk = 0; Metoden set: public void set(int pos, T x) { data[pos] = x; Metoden get: public T get(int pos) { return data[pos];

Da setter vi i gang Metoden size: public int size() { return ibruk; Metoden remove: For å fjerne et element, må vi dytte elementene lenger opp i arrayen ett hakk ned. public T remove(int pos) { T res = data[pos]; for (int i = pos+1; i < ibruk; i++) data[i-1] = data[i]; ibruk--; return res;

Da setter vi i gang Metoden add: Det er enkelt å legge til et element i arrayen, med ett unntak: Hvis arrayen er full, må vi 1 opprette en ny og større array og 2 kopiere innholdet over dit. public void add(t x) { if (ibruk == data.length) { @SuppressWarnings("unchecked") T[] ny = (T[])new Object[2*iBruk]; for (int i = 0; i < ibruk; i++) ny[i] = data[i]; data = ny; data[ibruk] = x; ibruk++;

Da setter vi i gang 0 Type: T[] Navn: ibruk 5 Type: int class Arrayliste 1 2 3 4 Type: T[]

Intet program er komplett uten testing! Testing TestListe.java estliste { public static void main(string[] args) { Liste<String> lx = new Arrayliste<>(); // Sett inn 13 elementer: for (int i = 0; i <= 12; i++) lx.add("a"+i); // Sjekk størrelsen: System.out.println("Listen har " + lx.size() + " elementer"); // Marker element nr 10: lx.set(10, lx.get(10)+"*"); // Fjern det første elementet: String s = lx.remove(0); System.out.println("Fjernet " + s); // Skriv ut innholdet: for (int i = 0; i < lx.size(); i++) System.out.println("Element " + i + ": " + lx.get(i)); // Lag en feil: lx.remove(999);

Intet program er komplett uten testing! Resultatet av testen er: java TestListe Listen har 13 elementer Fjernet A0 Element 0: A1 Element 1: A2 Element 2: A3 Element 3: A4 Element 4: A5 Element 5: A6 Element 6: A7 Element 7: A8 Element 8: A9 Element 9: A10* Element 10: A11 Element 11: A12 Exception in thread "main" java.lang.arrayindexoutofboundsexception: 999 at Arrayliste.remove(Arrayliste.java:30) at TestListe.main(TestListe.java:25) Det meste går bra, men 1 Gal parameter til remove gir en uforståelig feilmelding. (Det gjelder også get og set.)

Vi bør lage egne feilmeldinger Egne feilmeldinger En feilmeldinger bør være en subklasse av RuntimeException. Vi bør ta vare på relevant informasjon. UlovligListeindeks.java class UlovligListeindeks extends RuntimeException { public UlovligListeindeks(int pos, int max) { super("listeindeks " + pos + " ikke i intervallet 0-" + max); Da kan vi fange feilen og gi en god feilmelding: try { lx.remove(999); catch (UlovligListeindeks u) { System.out.println("Feil: "+u.getmessage());

Da er vi ferdige En perfekt(!) ArrayList Arrayliste.java class Arrayliste<T> implements Liste<T> { @SuppressWarnings("unchecked") private T[] data = (T[])new Object[10]; private int ibruk = 0; public void set(int pos, T x) { if (pos<0 pos>=ibruk) throw new UlovligListeindeks(pos,iBruk-1); data[pos] = x; public T get(int pos) { if (pos<0 pos>=ibruk) throw new UlovligListeindeks(pos,iBruk-1); return data[pos]; public T remove(int pos) { if (pos<0 pos>=ibruk) throw new UlovligListeindeks(pos,iBruk-1); T res = data[pos]; for (int i = pos+1; i < ibruk; i++) data[i-1] = data[i]; ibruk--; return res;

Hvordan holde orden på mange objekter Hvordan holde orden på objekter? class C class C class C class C class C class C class C Vi har mange objekter, men vi vet ikke på forhånd hvor mange. Hvordan holder vi orden på dem? Vi må kunne class C finne frem til et gitt objekt (for eksempel nr 7) sette inn nye objekter fjerne objekter Finnes det andre muligheter enn å bruke en array?

Vi kan kjede sammen pekerne til data Løsningen er lenkelister Navn: start Navn: neste Navn: neste Navn: neste null class Node { Node neste = null; T data; Type: T class Node Type: T class Node Type: T class Node Node(T x) { data = x; private Node start = null;??? 1 La hver Node inneholde en peker til det neste objektet. 2 Hver Node peker også på sine data. 3 Vi har en peker start til det første objektet.

Vi kan kjede sammen pekerne til data Klassen Lenkeliste Lenkeliste.java class Lenkeliste<T> implements Liste<T> { class Node { Node neste = null; T data; Node(T x) { data = x; private Node start = null; public int size() { public void add(t x) { public void set(int pos, T x) { public T get(int pos) { public T remove(int pos) {

Operasjonene til Liste Hvordan finne størrelsen? Vi må gå gjennom listen og telle alle nodene: Navn: start Node p = start; int n = 0; Navn: neste Navn: neste Navn: neste while (p!= null) { n++; p = p.neste; null Hint: Type: T class Node Type: T class Node Type: T class Node Hvis man ofte skal finne lengden, er det lurt å ha lengden lagret i en egen variabel.???

Operasjonene til Liste Hvordan hente et element? Vi må telle oss frem til den riktige noden: Navn: start Navn: neste Navn: neste Navn: neste null Node p = start; for (int i = 0; i < pos; i++) p = p.neste; Type: T class Node Type: T class Node Type: T class Node???

Operasjonene til Liste Hvordan sette et vilkårlig element i listen? Vi må først telle oss frem til det aktuelle elementet i listen: Navn: start Navn: neste Navn: neste Navn: neste Node p = start; for (int i = 0; i < pos; i++) { p = p.neste; p.data = x; Type: T class Node Type: T class Node null Type: T class Node???

Operasjonene til Liste Hvordan utvide listen med et element? Vi må først telle oss frem til det siste elementet i listen: Navn: start Node p = start; while (p.neste!= null) p = p.neste; p.neste = new Node(x); Navn: neste Navn: neste Navn: neste null NB! Det er ett spesialtilfelle vi må kunne håndtere: Hvis listen er tom, hva må gjør vi da? Type: T class Node? Type: T class Node? Type: T class Node?

Operasjonene til Liste Hvordan fjerne et element fra listen? Vi må først telle oss frem til elementet før det som skal fjernes: Navn: start Node p = start; for (int i = 1; i < pos; i++) p = p.neste; Node n = p.neste; p.neste = n.neste; Navn: neste Navn: neste Navn: neste null NB! Type: T class Node Type: T class Node Type: T class Node Igjen: Hva gjør vi for å fjerne det første elementet i listen????

Hva skjer neste uke? Neste uke Neste uke skal vi se nærmere på lenkelister og introdusere andre lignende strukturer. Java-bibliotekets ArrayList Hvis noen har lyst, kan de se på hvordan ArrayList er implementert i Java-biblioteket, se her: https://www-adm.uio.no/studier/emner/matnat/ifi/in1010/ v19/java/arraylist.java