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

Like dokumenter
Lenkelister og beholdere av lenkelister

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

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

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.

INF1010 siste begreper før oblig 2

INF1010. Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

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

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

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

UNIVERSITETET I OSLO

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

Velkommen til INF1010

Lenkelister. Lister og køer.

INF1010 Binære søketrær ++

INF1010 Arv. Marit Nybakken 2. februar 2004

Enkle generiske klasser i Java

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

INF våren 2017

INF Innleveringsoppgave 6

Generiske mekanismer i statisk typede programmeringsspråk

Versjon (vil bli endret).

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

INF1010 våren januar. Objektorientering i Java

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

INF Seminaroppgaver til uke 3

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Studieaktiviteter i INF1010

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

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

2 Om statiske variable/konstanter og statiske metoder.

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

UNIVERSITETET I OSLO

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

Introduksjon til objektorientert programmering

Obligatorisk oppgave 4: Lege/Resept

INF Notater. Veronika Heimsbakk 10. juni 2012

Læringsmål for forelesningen

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

INF1010 våren Arv og subklasser del 1

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

Tråder Repetisjon. 9. og 13. mai Tråder

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

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

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

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

Tråder Repetisjon. 9. og 13. mai Tråder

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Lenkelister og beholdere av lenkelister

INF1000: Forelesning 7

Innhold uke 10. Objektorientert programmering i Python. Oblig 7 og 8. IN1000 Seminar! IN1000 Høst 2018 uke 10 Siri Moe Jensen

INF1010. Grensesnittet Comparable<T>

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Dagens tema: 12 gode råd for en kompilatorskriver

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

INF1010 våren Grensesnitt

INF1000: Forelesning 6. Klasser og objekter del 1

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

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Sortering med tråder - Quicksort

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN våren 2019 Onsdag 16. januar

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

IN våren 2018 Tirsdag 16. januar

INF1000: Forelesning 7. Konstruktører Static

TDT4100 Objektorientert programmering

Vanlige datastrukturer. I dette lysarksettet

INF1010 våren Grensesnitt

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

UNIVERSITETET I OSLO

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

Velkommen til. INF våren 2016

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

UNIVERSITETET I OSLO

INF Obligatorisk innlevering 5

UNIVERSITETET I OSLO

Objektorientert design av kode. Refaktorering.

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

Transkript:

INF1010 forelesning Lenkelister II Dette skrivet inneholder en oversikt over det jeg planlegger å forelese på andre forlesning om lenkelister. Det inneholder stort sett programeksempler med kommentarer i samme rekkefølge som på forelesningen. Det er ikke sikkert vi kommer igjennom alt. Vi skal videreutvikle listeeksemplet som lå til grunn for første forelesning om lenkeliser. Vi har alt rettet feilene i det. Nå er målet å lage en ny listeklasse slik at vi kan lenke sammen andre objekter enn personobjekter. Vi vil også se på hvordan vi kan lage mange lenkelister med de samme objektene uten å måtte klone dem. Vi ønsker å utvikle en beholder for objekter (av ukjent type) hvor den interne datastruktur i beholderen er ei lenkeliste. Kort sagt en generell beholder for objekter. En rettet versjon av eksemplet fra sist: public class ListeAvPersoner { private Person f ø r s t e, s i s t e ; ListeAvPersoner ( ) { Person l h = new Person ( "LISTEHODE!! " ) ; f ø r s t e = l h ; s i s t e = l h ; a n t a l l = 0 ; public void settinnforan ( Person nypers ){ nypers. n e s t e = f ø r s t e. n e s t e ; f ø r s t e. n e s t e = nypers ; i f ( s i s t e. n e s t e == nypers ) // nyperson er ny siste! s i s t e = nypers ; public void settinnbak ( Person inn ){ public void s e t t I n n E t t e r ( Person denne, Person nypers ) { nypers. n e s t e = denne. n e s t e ; denne. n e s t e = nypers ; i f ( s i s t e. n e s t e == nypers ) // nyperson er ny siste! s i s t e = nypers ; public Person f i n n P e r s o n ( S t r i n g s ) { Person p = f ø r s t e. n e s t e ; for ( int i = a n t a l l ; i >0; i ) { i f ( p. hentnavn ( ). e q u a l s ( s ) ) return p ; else p = p. n e s t e ; return null ; Har fjernet metoder som ikke er vesentlig for det vi skal gjøre her (metoden som skriver ut bl.a.). Hvis vi ønsker å lagre viner i stedet for, må vi gjøre to endringer: klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

public class ListeAvViner { private Vin f ø r s t e, s i s t e ; ListeAvViner ( ) { Vin l h = new Vin ( "LISTEHODE!! " ) ; public void settinnbak ( Vin inn ){ Hvis vi skulle lagre gaveobjekter (objekter som er instanser av klasser som implementerer grensesnittet Gave), hva må vi gjøre da? Den viktigste ulempen med listeklassen, er at objektene som lenkes sammen bare kan være med i ei liste av gangen, siden de bare har en nestepeker. Hvis vi laget flere nestepekere, kunne vi få til så mange lister som vi hadde pekere, men det er ingen tilfredsstillende løsning! Hvordan kan vi skrive programmet slik at vi kunne lage så mange lenkelister vi ville, som inneholdt personer f.eks., uten at vi måtte klone personobjektene for hver liste? Vi innfører følgende lille geniale klasse: class Node { Node ( Person p ) { o b j e k t e t = p ; Person p e r s o n o b j e k t e t ; Av denne klassen kan vi lage objekter (instanser) med to egenskaper: 1. de kan lenkes sammen gjennom lenka (pekeren) Node neste 2. hvert objekt kan peke på et personobjekt Disse objektene kaller vi knuter eller noder (fra latin nodus som betyr knute). Når et personobjekt skal inngå i ei liste med slike nodeobjekter, må vi i listeklassen lage et nytt nodeobjekt og sette dette til å peke på personobjektet og sette nodeobjektet inn i lista: class Node { // konstruktøren setter opp peker til personobjektet: Node ( Person p ) { p e r s o n o b j e k t e t = p ; Person p e r s o n o b j e k t e t ; public class ListeAvPersoner { ListeAvPersoner ( ) { Node l h = new Node (new Person ( "LISTEHODE!! " ) ) ; public void settinnbak ( Person nyperson ) { Node inn = new Node ( nyperson ) ;

Når et personobjekt settes inn lages det ikke en kopi av det, men en ny peker til objektet. Slik kan samme personobjekt pekes på fra «uendelig mange» lenkelister. Vi så ovenfor at det er vanseklig å bruke den første lenkelista til gaveobjekter(jf. oblig 3), siden Gave er et grensesnitt og ikke kan ha variable og da heller ingen nestepeker (Gave neste). Dette problemet forsvinner nå, siden nestepekeren ligger i knuteobjektet Node. Her er samme klasse for å lage lenkelister av gaveobjekter: class Node { // konstruktøren setter opp peker til gaveobjektet: Node ( Gave g ) { o b j e k t e t = g ; Gave g a v e o b j e k t e t ; public class ListeAvGaver { ListeAvGaver ( ) { Node l h = new Node (new Gave ( "LISTEHODE!! " ) ) ; // hva er galt her? public void settinnbak ( Gave nygave ) { Node inn = new Node ( nygave ) ; Legg merke til at metodene i listeklassen nå ikke forandrer på noen egenskaper i Person eller Gave. Metodene oppretter nye nodeobjekter og tilordner verdier til disse (neste og objektet). Disse to pekervariablene brukes bare av metodene inne i listeklassen. Siden programmet utenfor listeklassen ikke trenger å ha tilgang til nodeobjektene, er det god objektorientering å skjule denne klassen ved å gjøre den til en indre klasse, en klasse i klassen: public class ListeAvGaver { Node ( Gave g ) { o b j e k t e t = g ; Gave g a v e o b j e k t e t ; ListeAvGaver ( ) { Node l h = new Node (new Gave ( "LISTEHODE!! " ) ) ; // hva er galt her? public void settinnbak ( Gave nygave ) { Node inn = new Node ( nygave ) ;

Modifikatoren private gjør at Node er usynlig utenfor klassen (vi kan ikke deklarere en variabel av type Node utenfor klassen, med mindre vi har en annen klasse med samme navn der). Hvis klassen ikke er private, er den synlig som ListeAvGaver.Node, f.eks. kunne vi da ha laget et nodeobjekt med et gaveobjekt (f.eks. et objekt av Vin som implementerer Gave) utenfor klassen med ListeAvGaver. Node etfno = new ListeAvGaver. Node (new Vin ( " k v i t v i n " ) ) ; men dette har vi liten nytte av, derfor er det god programmeringsskikk og la indre klasser være skjult. Vi kommer ikke til å bruke indre klasser til mye mer enn dette i INF1010. Men fortsatt er listeklassen ikke i stand til å lagre annet en objekter av bestemte typer. ListeAvGaver kan riktignok lagre gaver av flere typer, så lenge objektene er instanser av klasser (eller subklasser til klasser) som implementerer grensesnittet Gave. Object-klassen er alle klassers mor eller superklasse. En variabel av type Object kan peke på objekter av alle klasser. public class ListeAvObjekter { Node ( Object obj ) { o b j e k t e t = obj ; Object o b j e k t e t ; ListeAvObjekter ( ) { Node l h = new Node (new Object ( ) ) ; public void settinnbak ( Object nyttobjekt ) { Node inn = new Node ( nyttobjekt ) ; public Object tautforan ( ) { // fjerner en node og returnerer objektet i f ( n!= null ) { f ø r s t e. n e s t e = n. n e s t e ; return n. o b j e k t e t ; else return null ; I denne lenkelista kan vi satte inn objekter av type Object og alle objekter av klasser som er subklasser til Object, dvs. alle objekter vi kan lage i Java! Så hvis denne fungerer for alt mulig, hva skal vi da med alternativer? Problemet med denne beholderen er at vi ikke vet mer om objektene i den enn at de har egenskapene til Object, jf. Javas API. Vi kan sette inn (metoden settinnbak) hva som helst. Til gjengjeld vet vi ikke hva vi får når vi tar ut (metoden tautforan). Her må vi evt. sjekke med

instanceof og typekonvertere. Hvis vi vet typen på objektet som hentes ut, kan vi typekonvertere direkte. Dette slipper vi hvis vi lar typen til objektene som inn i lista være (generisk) parameter til klassen: public class LenkeListe <T> { Node (T t ) { o b j e k t e t = t ; T o b j e k t e t ; LenkeListe ( ) { Node l h = new Node ( null ) ; // listehode f ø r s t e = l h ; s i s t e = l h ; a n t a l l = 0 ; public void settinnforan (T t ) { Node n = new Node ( t ) ; n. n e s t e = f ø r s t e. n e s t e ; f ø r s t e. n e s t e = n ; i f ( s i s t e. n e s t e == n ) // n er nytt sisteobjekt! s i s t e = n ; public T tautforan ( ) { i f ( n!= null ) { f ø r s t e. n e s t e = n. n e s t e ; return n. o b j e k t e t ; else return null ; Her er eksempler på bruk. Først en klasse hvor vi kan lagre objekter av klassen Bil. (Egentlig alle klasser som er subklasser av Bil eller subklasser til en klasse som implementerer Bil hvis Bil er et grensesnitt). LenkeListe <Bil > s t o r g a r a s j e = new LenkeListe <Bil >(); En lenkeliste med personer. Ved å lage flere slike kunne erstattet personarrayene i Person (fra obligene) med slike lenkelister av personer: LenkeListe <Person> minevenner = new LenkeListe <Person >(); LenkeListe <Person> k j e n n e r = new LenkeListe <Person >(); LenkeListe <Person> l i k e r I k k e = new LenkeListe <Person >(); Og et eksempel på en beholder for gaveobjekter à la oblig 3. Obs. Gave er her et grensesnitt: LenkeListe <Gave> gavebutikk = new LenkeListe <Gave >(); Hvis vi i listeklassen trenger å kjenne noen av egenskapene til objektene, er det mulig. Hvis vi vet at vi bare ønsker å lagre objekter av klasser som implementerer Gave-grensesnittet, kan vi skrive public class LenkeListe <T extends Gave> { Node (T t ) { o b j e k t e t = t ; T o b j e k t e t ; LenkeListe ( ) {

Node l h = new Node ( null ) ; // listehode f ø r s t e = l h ; s i s t e = l h ; a n t a l l = 0 ; public void settinnforan (T t ) { Node n = new Node ( t ) ; n. n e s t e = f ø r s t e. n e s t e ; f ø r s t e. n e s t e = n ; i f ( s i s t e. n e s t e == n ) // n er nytt sisteobjekt! s i s t e = n ; public T tautforan ( ) { i f ( n!= null ) { f ø r s t e. n e s t e = n. n e s t e ; return n. o b j e k t e t ; else return null ; Her kan vi få tak i gaveegenskaper (fra grensesnittet) inne i klassen, f.eks. slik: public T f inngaveikategori ( S t r i n g s ) { for ( int i = a n t a l l ; i >0; i ) { i f ( n. o b j e k t e t. k a t e g o r i ( ). e q u a l s ( s ) ) return n. o b j e k t e t ; else n = n. n e s t e ; return null ;