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

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

INF1010 Binære søketrær ++

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

INF1010 siste begreper før oblig 2

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

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

INF1010. Grensesnittet Comparable<T>

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

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

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

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

Seminaroppgaver IN1010, uke 2

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

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

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

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) 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

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF1010. Stein Michael Storleer (michael) Lenkelister

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

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

Algoritmer og Datastrukturer

INF1000: Forelesning 7

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010 e-postadresser

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF Notater. Veronika Heimsbakk 10. juni 2012

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

INF1000: Forelesning 7. Konstruktører Static

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

Generelle trær BINÆRTRÆR. Binærtrær

INF1010 våren Grensesnitt

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

Algoritmer og datastrukturer Eksamen

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

IN1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Velkommen til INF1010

INF1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Eksamen

2 Om statiske variable/konstanter og statiske metoder.

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Lenkelister. Lister og køer.

Obligatorisk oppgave 4: Lege/Resept

Studieaktiviteter i INF1010

INF1010 våren Grensesnitt

Vanlige datastrukturer. I dette lysarksettet

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

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

INF1010 våren Arv og subklasser del 1

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

INF1010 våren Arv og subklasser del 1

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Versjon (vil bli endret).

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Løsnings forslag i java In115, Våren 1996

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Eksamen

INF1010 våren Grensesnitt (interface)

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Gjennomgang av eksamen H99

Sortering med Comparable og Comparator

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Algoritmer og datastrukturer Løsningsforslag

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

Kapittel 9: Sortering og søking Kort versjon

2 Om statiske variable/konstanter og statiske metoder.

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

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

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

OO-eksempel. Modellen ser slik ut: Studenter + antstudenter : int = 0

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

Algoritmer og datastrukturer Eksamen

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

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

INF1010 våren Arv og subklasser - del 2

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

Fagnr: A. Ant. vedlegg: 1 (2 sider)

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

Løsningsforslag Test 2

INF1010 Arv. Marit Nybakken 2. februar 2004

Transkript:

Godkjent oblig 1? Les e-post til din UiO-adresse Svar på e-post fra lablærer Ingen godkjenning før avholdt møte med lablærer Godkjentlistene brukes ikke til å informere om status for obligene Ta vare på all e-post om obliger Motivasjon for eksemplet I det følgende eksempel, er motivet å vise et eksempel på bruk av grenesnitt, subklasser, abstrakte klasser og generiske typer i en pekerkjedestruktur, et binærtre. Eksemplet må av pedagogiske grunner være kort, og vil framstå som unødig «overlesset». Hovedideen er å bruke grensnitt og subklasser for å skille ut det som har med binærtrestrukturen å gjøre. Generisk type brukes for å definere selve binærtreet, slik at det kan brukes på alle objekter som har de rette strukturelementene (kan spille rollen «inngå i et binærtre»). Dagens forelesning Eks 1: Binærtre Motivasjon for eksemplet Binærtretraversering Gjøre noe i hele treet = kalle på samme metode i alle objekten Eks 2: Binærtre og stakk Idé Et grensesnitt som beskriver rollen Rolle En (abstrakt) klasse som implementer Rolle En klasse som utvider og beskriver objektene (personene) En generisk klasse BTre som kan lage binære trær av objekter som er subklasser av (og indirekte implementerer Rolle)

1 interface Rolle {... } 2 abstract class implements Rolle {... } 3 class INF1010Person extends {... } 4 class BTre <T extends > {... } 5 class GBTeksempel { 6 public static void main( String [ ] args ) { 7 BTre <INF1010Person> INF1010PersonTre = 8 new BTre <INF1010Person >(); 9 } 10 } Klassen som beskriver et objekt som kan spille binærtreelementrollen 1 abstract class implements Rolle { 2 private venstre, høyre ; 3 abstract int sammenlign( Object o ) ; 4 abstract void skrivut ( ) ; 5 public hentvsubtrepeker ( ) { return venstre ; } 6 public henthsubtrepeker ( ) { return høyre ; } 7 public void setthsubtrepeker( Object o) { høyre = ( ) o; } 8 public void settvsubtrepeker ( Object o) { venstre = ( ) o; 9 public void leggtilbtre ( Object inn ) {... } 10 } Rollen binærtreelement 1 interface Rolle { 2 public Object hentvsubtrepeker ( ) ; 3 public Object henthsubtrepeker ( ) ; 4 public void setthsubtrepeker( Object o ) ; 5 public void settvsubtrepeker ( Object o ) ; 6 public void leggtilbtre ( Object o ) ; Klassen som beskriver objektene som skal inn i treet 1 class INF1010Person extends { 2 private String navn; 3 INF1010Person ( String n) { navn = n; } 4 int sammenlign( Object bte ) { 5 return navn.comparetoignorecase ( ( ( INF1010Person ) bte ).navn 6 } 7 String hentnavn ( ) { return navn; } 8 void skrivut ( ) { } 9 }

hentvsubtrepeker henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre venstre høyre INF1010Person void skrivut String hentnavn int sammenlign navn Et INF1010Personobjekt String Vi forminsker og forenkler objektet navn INF1010Person String void skrivut String hentnavn int sammenlign hentvsubtrepeker henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre venstre høyre navn INF1010Person String void skrivut String hentnavn int sammenlign hentvsubtrepeker henthsubtrepeker void settvsubtrepeker void setthsubtrepeker void leggtilbtre venstre høyre Vi flytter litt på innholdet Klassen som beskriver objektet som inneholder binærtreet 1 class BTre <T extends > { 2 private T rot ; 3 4 public void settinn (T inn ) { 5 if ( rot == null ) rot = inn ; 6 else rot. leggtilbtre ( inn ) ; 8 9 public void skrivut ( ) { 10 if ( rot!= null ) rot. skrivut ( ) ; 11 } 12 }

Hvor langt har main-metoden kjørt? kristhk haavand nikolark andrepar kristhk rot haavand nikolark andrepar rot kristhk INF1010person INF1010PersonTre haavand niko BTre andrepar Koden i main som skaper datastrukturen i skissen på forrige lysark 1 public class GBTeksempel{ 2 public static void main( String [ ] args ) { 3 BTre <INF1010Person> INF1010PersonTre = 4 new BTre <INF1010Person >(); 5 INF1010PersonTre. settinn (new INF1010Person ( kristhk ) ) ; 6 INF1010PersonTre. settinn (new INF1010Person ( haavaand ) ) 7 INF1010PersonTre. settinn (new INF1010Person ( andrepar ) ) 8 INF1010PersonTre. settinn (new INF1010Person ( nikolark ) ) 9 <Se struktur bygget opp så langt på forrige lysark>

Sette inn det første objektet Vi lager objektet ved å utføre konstruktøren i INF1010Person: 1 new INF1010Person ( kristhk ) Dette objektet gis som parameter til et kall på settinn i BTre-objektet INF1010PersonTre: 1 INF1010PersonTre. settinn (new INF1010Person ( kristhk ) ) ; 2 3 4 public void settinn ( INF1010Person inn ) { 5 if ( rot == null ) rot = inn ; 6 else rot. leggtilbtre ( inn ) ; Vi får satt rot til å peke på objektet med navn lik kristhk. Innsettingsmetoden er inne i objektet Alle objektene i treet har en metode som kan sette inn innparameterobjektet. Når vi kaller innsettingsmetoden inne i et objekt med personen som som skal settes inn som parameter, vil denne først sjekke om innobjektet skal settes inn til venstre eller til høyre. Deretter settes objektet inn der ved å sette høyre- eller venstrepekeren til å peke på objektet som skal inn, dersom det ikke er noe der fra før. Hvis det er et objekt der fra før sendes parameteren videre ved å kalle på dette objektets settinnmetode. Sette inn det andre objektet Objektet blir laget på samme måte som det første. Men rot er ikke lenger null og vi får et kall på leggtilbtre i objektet som rot peker på. I denne metoden blir «kristhk» sammenlignet med «haavaand». Resultatet blir større enn null og metoden sjekker om venstrepekeren peker til noe. Det gjør det ikke og objektet «haavaand» blir satt inn der. Så gjentas dette for hvert nytt objekt som skal settes inn. Vi starter hver gang i rota (kaller på leggtilbtre), finner ut «hvilken vei vi skall» og kaller på leggtilbtre i riktig subtrerot. Slik sendes parameteren fra metode til metode nedover i treet til vi kommer til en peker som er null. Da settes denne til å peke på innobjektet. 1 public void leggtilbtre ( Object inn ) { 2 int smnlgn = this. sammenlign( inn ) ; 3 if ( smnlgn < 0 ) 4 i f ( henthsubtrepeker ( ) == null ) 5 setthsubtrepeker( inn ) ; 6 else henthsubtrepeker ( ). leggtilbtre ( inn ) ; 7 else 8 i f ( hentvsubtrepeker ( ) == null ) 9 settvsubtrepeker ( inn ) ; 10 else hentvsubtrepeker ( ). leggtilbtre ( inn ) ; 11 }

Drøft disse spørsmålene Hva gjør settinnmetoden i objektet som blir satt inn? Hvorfor kan vi ikke sette objektet der det er ledig hvis pekeren der det skal ikke er det? Hva skjer hvis vi setter inn to objekter med samme navn? Gjøre noe i hele treet = kalle på samme metode i alle objektene Skrive ut alle objektene I personklassen: 1 void skrivut ( ) { 2 p = hentvsubtrepeker ( ) ; 3 if (p!= null ) p. skrivut ( ) ; 4 5 System. out. print (hentnavn ()+ ) ; 6 7 if (henthsubtrepeker ( )!= null ) 8 henthsubtrepeker ( ). skrivut ( ) ; 9 } Gjøre noe i hele treet = kalle på samme metode i alle objektene Gjøre noe i alle objektene For å gjøre en konkret oppgave (sette en variabel til en bestemt verdi) i alle objektene kan vi: Utfør oppgaven i rotobjektet Utfør oppgaven i venstre subtre Utfør oppgaven i høyre subtre Disse tre operasjonene kan vi gjøre i vilkårlig rekkefølge. Oppgaven vil bli gjort i alle objektene, men i forskjellig rekkefølge. Idé Bruk av indre klasser I dette eksemplet er ideen at vi bruker indre klasser til strukturelementene. (Både for binærtre- og og listeobjektene). Fra strukturelementene går det en peker (generisk (T) eller generell (Object)) til dataobjektet. Med en slik organisering av dataene, er det naturlig å tegne objekter av den indre klassen inne i et objekt av den ytre klassen.

toppelement rot ListeNode skrivut tilstakk leggtilbtre skrivut BTreNode C Objekter av klassen Bil frabtretilstakk lifo BTre Rollen Skrivbar og klassen BTre 1 interface Skrivbar { 2 void skrivut ( ) ; 3 } 4 class BTre <T extends Skrivbar & Comparable <T>> { 5 BTreNode rot ; 6 void leggtilbtre (T t ) { } 7 void skrivut ( ) { } 8 void frabtretilstakk ( Stakk liste ) { } 9 10 class BTreNode { 11 BTreNode venstre, høyre ; 12 T denne; 13 BTreNode(T t ) { denne = t ; } 14 void leggtilbtre ( BTreNode inn ) { } 15 void frabtretilstakk ( Stakk liste ) { } 16 void skrivut ( ) { } 17 18 } } 1 interface Skrivbar { } 2 3 class BTre <T extends Skrivbar & Comparable <T>> { 4 BTreNode rot ; 5 class BTreNode { } 6 } 7 class Stakk { 8 ListeNode toppelement ; 9 class ListeNode { } 10 } 11 class B i l implements Comparable <Bil >, Skrivbar { } 12 13 public class TreStakkEksempel{ 14 BTre <Bil > biltre = new BTre <Bil >(); 15 Stakk lifo = new Stakk ( ) ; 16 } Listeklassen 1 class Stakk { 2 ListeNode toppelement ; 3 4 class ListeNode { } 5 6 void skrivut ( ) { } 7 8 void tilstakk ( Object o ) { } 9 }

Klassen som beskriver selve dataobjektet (Bil) 1 class B i l implements Comparable <Bil >, Skrivbar { 2 private String navn; 3 Bil ( String n) { navn = n; } 4 5 public int compareto( Bil b) { 6 return navn.comparetoignorecase (b.navn ) ; 8 9 String hentnavn ( ) { return navn; } 10 11 public void skrivut ( ) { } 12 } Metoden som legger et objekt til LIFO-lista 1 class Stakk { 2 ListeNode toppelement ; 3 4 class ListeNode { 5 ListeNode neste ; Object denne; 6 ListeNode( Object objekt ) {denne = objekt ; } 8 9 void tilstakk ( Object o ) { 10 ListeNode ln = new ListeNode(o ) ; 11 ln. neste = toppelement ; 12 toppelement = ln ; 13 } 14 } Klassen som beskriver eksemplet (main) 1 public class TreStakkEksempel{ 2 public static void main( String [ ] args ) { 3 BTre <Bil > biltre = new BTre <Bil >(); 4 5 Stakk lifo = new Stakk ( ) ; 6 7 biltre. leggtilbtre (new Bil ( kristhk ) ) ; 8 // <.... mange utelatt > 9 biltre. skrivut ( ) ; 10 System. out. println( ========== ) ; 11 biltre. frabtretilstakk ( lifo ) ; 12 lifo. skrivut ( ) ; 13 } 14 } Metodene som gjør om fra binærtre til liste 1 class BTre <T extends Skrivbar & Comparable <T>> { 2 BTreNode rot ; 3 void frabtretilstakk ( Stakk liste ) 4 { if ( rot!= null ) rot. frabtretilstakk ( liste ) ; } 5 6 class BTreNode { 7 BTreNode venstre, høyre ; 8 T denne; 9 BTreNode(T t ) { denne = t ; } 10 11 void frabtretilstakk ( Stakk liste ) { 12 if ( venstre!= null ) venstre. frabtretilstakk ( liste ) ; 13 liste. tilstakk (denne) ; 14 if (høyre!= null ) høyre. frabtretilstakk ( liste ) ; 15 } 16 } 1