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

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

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

INF1010. Grensesnittet Comparable<T>

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

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

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

Enkle generiske klasser i Java

INF1010 våren Grensesnitt

INF1010 våren Grensesnitt

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

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)

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF1010 våren Grensesnitt (interface)

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

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

IN1010 våren januar. Objektorientering i Java

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

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

INF1010. Stein Michael Storleer (michael) Lenkelister

INF1010 våren Interface (Grensesnitt)

UNIVERSITETET I OSLO

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1010 våren januar. Objektorientering i Java

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

Kapittel 9: Sortering og søking Kort versjon

INF1010 våren Arv og subklasser del 1

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser - del 2

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

Gjennomgang av eksamen H99

INF1010 våren Arv, subklasser og grensesnitt - del 2

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 Binære søketrær ++

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

2 Om statiske variable/konstanter og statiske metoder.

INF1010 våren februar. Arv og subklasser, del 2. Repetisjon. Repetisjon - Biler. Repetisjon: Klasser - Subklasser

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Løsningsforslag til eksamen i INF1000 våren 2006

INF Uke 10. Ukesoppgaver oktober 2012

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

INF1010 våren Arv og subklasser del 1

INF våren 2017

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

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

Abstrakte metoder og klasser. Abstrakte metoder og klasser. Uke 9 INF1010, 27. februar 2007, Abstrakte klasser og grensesnitt (interface)

INF1010 våren Arv og subklasser - del 2

IN våren 2018 Tirsdag 16. januar

IN våren 2019 Onsdag 16. januar

INF1010 våren Arv og subklasser - del 2

(MVC - Model, View, Control)

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

Løsningsforslag Test 2

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

INF1000: Forelesning 7. Konstruktører Static

Løsningsforslag, inf101, våren 2001

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Uke 6 INF1010, 5. februar 2008, Abstrakte klasser og grensesnitt (interface) Stein Gjessing Inst for Informatikk Univ. i Oslo

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000: Forelesning 7

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

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

Kapittel 8: Sortering og søking INF100

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Kapittel 9: Sortering og søking Kort versjon

2 Om statiske variable/konstanter og statiske metoder.

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

INF Løsning på seminaropppgaver til uke 8

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

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

Kapittel 8: Sortering og søking INF100

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

UNIVERSITETET I OSLO

Klasser og objekter. Tuva Kristine Thoresen 22. oktober Institutt for Informatikk

Algoritmer og datastrukturer Eksamen

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

INF1000: noen avsluttende ord

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

Kapittel 9: Sortering og søking Kort versjon

Institutt for informatikk. INF1010, 18. februar 2010, Inst for Informatikk

INF1000 (Uke 14) Resten av eksamen H03 + del av V05

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

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

Abstrakte metoder og klasser. Abstrakte metoder og klasser

INF1010 våren 2017 Torsdag 2. februar. Arv og subklasser - del 2

Velkommen til. INF våren 2016

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Transkript:

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

Vi tar utgangspunkt i dette programmet for å vise krav til klasseparametre og egendefinerte iteratorer class Person { public String navn; Person(String navn) { this.navn = navn; public void skrivut() { System.out.println("Navnet er: " + navn); class PersonBeholder{ Person ene = null; public void settinn(person p) { ene= p; public void skrivut() { ene.skrivut(); class Hoved { public static void main(string[] args) { PersonBeholder minpbeholder = new PersonBeholder ( ); Person petter = new Person("Petter"); minpbeholder.settinn(petter); minpbeholder.skrivut(); Person anne = new Person("Anne"); minpbeholder.settinn(anne); minpbeholder.skrivut(); 2

interface Utkledd <U> { U utkleddsom(); Krav til klasse-parametre Formoe class VanligHund { class Person { String navn = Formoe ; class Sjorover extends Person{ navn class KarnevalsHund <U > extends VanligHund implements Utkledd<U> { U likner; // peker til en jeg er utkledd som KarnevalsHund(U forbilde) {likner = forbilde; public U utkleddsom() {return likner; String navntilutkleddsom () { return likner.navn; class Hoved{ public static void main (String[] args) { Sjorover rover = new Sjorover(); KarnevalsHund<Sjorover> passopp= new KarnevalsHund<Sjorover>(rover); Sjorover sjopeker = passopp.utkleddsom(); System.out.println(passopp.navnTilUtkleddSom()); VanligHund Utkledd<U> likner KarnevalsHund<U extends Person> 3

interface Utkledd <U> { U utkleddsom(); Krav til klasse-parametre Formoe class VanligHund { class Person { String navn = Formoe ; class Sjorover extends Person{ navn class KarnevalsHund <U extends Person> extends VanligHund implements Utkledd<U> { U likner; // peker til en jeg er utkledd som KarnevalsHund(U forbilde) {likner = forbilde; public U utkleddsom() {return likner; String navntilutkleddsom () { return likner.navn; class Hoved{ public static void main (String[] args) { Sjorover rover = new Sjorover(); KarnevalsHund<Sjorover> passopp= new KarnevalsHund<Sjorover>(rover); Sjorover sjopeker = passopp.utkleddsom(); System.out.println(passopp.navnTilUtkleddSom()); VanligHund Utkledd<U> likner KarnevalsHund<U extends Person> 4

Comparable i Java-biblioteket interface Comparable <T> { int compareto (T obj) ; compareto returns a negative, zero or a positive integer as this object is less than, equal to, or greater than the specified object class Bil implements Comparable <Bil> {... class Person implements Comparable <Person> {... class Fly implements Comparable <Bil> {... Men hvem ønsker å sammenligne Fly med Biler? Objekt av klassen Bil Comparable<T> Object compareto(bil b) Bil implements Comparable <Bil> 5

Finn beste hund class StedTilTaVarePaaBeste < U > { private U beste= null; public void settinn(u ny) { if( beste== null) beste= ny; else if (beste er dårligere enn ny) beste= ny; public U hentbeste() {return beste; Navn: hundehuset Ins$tu' for informa$kk Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Hund hentbeste() return beste; class Katt { class Hund { class Person { Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast 29 poeng public int sammenlign (Hund hnd) return...; Navn: passopp 42 poeng public int sammenlign (Hund hnd) return...; Navn: kea 31 poeng public int sammenlign (Hund hnd) return...; 6

Finn beste hund class StedTilTaVarePaaBeste < U > { private U beste= null; public void settinn(u ny) { if( beste== null) beste= ny; else if (beste.compareto(ny) < 0) beste= ny; public U hentbeste() {return beste; Navn: hundehuset Ins$tu' for informa$kk Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Hund hentbeste() return beste; class Katt { class Hund { class Person { Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast 29 poeng public int compareto (Hund hnd) return...; Navn: passopp 42 poeng public int compareto (Hund hnd) return...; Navn: kea 31 poeng public int compareto (Hund hnd) return...; 7

Finn beste hund class StedTilTaVarePaaBeste < U > { private U beste= null; public void settinn(u ny) { if( beste== null) beste= ny; else if (beste.compareto(ny) < 0) beste= ny; public U hentbeste() {return beste; Navn: hundehuset Ins$tu' for informa$kk Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Hund hentbeste() return beste; class Katt { class Hund implements Comparable <Hund>{ class Person { Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast 29 poeng public int compareto (Hund hnd) return...; Navn: passopp 42 poeng public int compareto (Hund hnd) return...; Navn: kea 31 poeng public int compareto (Hund hnd) return...; 8

Finn beste hund extends class StedTilTaVarePaaBeste < U implements Comparable <U>> { private U beste= null; public void settinn(u ny) { if( beste== null) beste= ny; else if (beste.compareto(ny) < 0) beste= ny; public U hentbeste() {return beste; Navn: hundehuset Ins$tu' for informa$kk Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Hund hentbeste() return beste; Navn: beste class Hund implements Comparable <Hund>{ StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast 29 poeng public int compareto (Hund hnd) return...; Navn: passopp 42 poeng public int compareto (Hund hnd) return...; Navn: kea 31 poeng public int compareto (Hund hnd) return...; 9

class Hund implements Comparable <Hund>{ int poeng; Hund(int png) {poeng= png; public int compareto (Hund hnd) { return poeng hnd.poeng; trofast = new Hund(29); passopp = new Hund(42); if (trofast.compareto(passopp) < 0) {... Navn: trofast Navn: passopp Objekt av class Hund implements Comparable <Hund> Objekt av class Hund implements Comparable <Hund> 29 poeng 42 poeng public int compareto (Hund hnd) public int compareto (Hund hnd) Navn: hnd return hnd.poeng - poeng Navn: hnd return hnd.poeng - poeng 10

Evas hus Navn: hjem Ins$tu' for informa$kk interface Comparable <T> { int compareto (T obj) ; Type: StedTilTaVarePaaBeste<Person> class StedTilTaVarePaaBeste < U extends Comparable <U> > { private U beste= null; Navn: ole public void settinn(u ny) { if( beste== null) beste= ny; Type: Person else if (beste.compareto(ny) < 0) beste= ny; poeng 17 public U hentbeste() {return beste; public int compareto(person prs) class Person implements Comparable <Person> { int poeng; Person (int png) {poeng= png; public int compareto (Person prs) { return poeng - prs.poeng; class BrukSted { public static void main (String [ ] args) { StedTilTaVarePaaBeste<Person> hjem= new StedTilTaVarePaaBeste<Person>( ); Person ole = new Person(17); hjem.settinn(ole); Person per = new Person(25); hjem.settinn(per); Person paal= new Person(21); hjem.settinn(paal); Person bestitest = hjem.hentbeste (); System.out.println(bestITest.poeng); void settinn(person ny) if( beste== null) beste= ny; else if (beste.compareto(ny) > 0 beste= ny; Person hentbeste() return beste; return...; Navn: beste Navn: per Type: Person Type: Person Navn: paal poeng 25 public int compareto(person prs) return...; Type: Person 21 poeng public int compareto(person prs) Navn: bestitest Type: Person return...; 11

Flere krav til klasse-parametre: & interface Skriv{ void skrivut(); class Person implements Comparable <Person>, Skriv { public String navn; Person(String navn) { this.navn = navn; public void skrivut() {System.out.println("Navnet er: " + navn); public int compareto (Person p) {return navn.compareto(p.navn); class BestBeholder <T extends Comparable<T> & Skriv> { T ene = null; public void settinn(t p) { if (ene == null) ene = p; else if( p.compareto(ene) < 0) ene= p; public void skrivut(){ene.skrivut(); class HovedComp { public static void main(string[] args) { BestBeholder<Person> minpbeholder = new BestBeholder<Person> ( ); Person petter = new Person("Petter"); minpbeholder.settinn(petter); minpbeholder.skrivut(); Person anne = new Person("Anne"); minpbeholder.settinn(anne); minpbeholder.skrivut(); Person bjarne = new Person("Bjarne"); minpbeholder.settinn(bjarne); minpbeholder.skrivut(); 12

For de spesielt interesserte class Bil {... // Hvis du absolutt må sammenligne fly med biler: class Fly implements Comparable <Bil> {... public int compareto(bil b) {... ; return... ; // Hvis vi skal ta vare på to ting, der vi ikke krever noe om den første (T), men krever at den andre tingen (U) kan sammenlignes med den første: class Beholder <T, U extends Comparable <T>> {... // For eksempel; Beholder <Bil,Fly> minb = new Beholder <Bil, Fly> ( ) ; 13

Indre klasser n n n n Klasser i Java kan defineres inni hverandre. Objekter i den indre klassen kan referere til metoder og variable i sitt omsluttende objekt! * + Lettvint + Skjuler implementasjon Flere feilmuligheter class Register { HashMap<String,Person> liste;... class Person { String navn;... void registrer() {... liste.put(navn,this);... // Slutt class Person... // Slutt class Register Du må altså opprette et objekt av den ytre klassen før du får lov til å lage objekter av den indre klassen (*hvis ikke den indre klassen er static ) 14

Ikke noe nytt her From the Java language specification (version 6): (nesten det samme i versjon 7) 14.14.2 The enhanced for statement The enhanced for statement has the form: EnhancedForStatement: for ( VariableModifiers opt Type Identifier: Expression) Statement The Expression must either have type Iterable or else it must be of an array type ( 10.1), or a compile-time error occurs. Kalles også "for-each 15

String-array Ikke noe nytt her class Hoved { public static void main (String [ ] args) { String [ ] alles = { Ole", Eva", Lise", Per", Turid", Anne"; for (String s: alles) System.out.println(s); String [ ] alles Ole Eva Anne Akvarium med array class Hoved { public static void main (String [ ] args) { Fisk[ ] allef = {new Fisk("Langen"), new Fisk("Slanken"), new Fisk("Lynet"), new Fisk("Latsabb"), new Fisk("Dorsken"), new Fisk("Storhodet"); Fisk [ ] allef for (Fisk f: allef) System.out.println(f.navn); class Fisk { String navn; Fisk (String nv) {navn = nv; 16

Ikke noe nytt her Akvarium med HashMap import java.util.*; class Hoved { static String [ ] allenavn = { Rar", Slanken", Lynet", Pigg", Dorsken, Stor ; public static void main (String [ ] args) { HashMap<String,Fisk> akvarium = new HashMap<String,Fisk>(); Navn: f Type: Fisk for (int i = 0; i < 6; i++) { Fisk f = new Fisk(alleNavn(i)); akvarium.put(f.navn, f); for (Fisk f: akvarium.values() ) System.out.println(f.navn); class Fisk { String navn; Fisk (String nv) {navn = nv; 17

Hvordan skal vi klare å gå gjennom alle objektene i vår egendefinerte beholder? public void legginn (T en) public T hentut( ) alle [antall] = peker; antall ++; antall --; return alle [antall]; Navn: antall Type: int T [ ] alle Iterable<T> iterergjennomalle()????? NB! slike objekter finnes ikke!! (T må få en verdi først) 18

EnhancedForStatement: for ( VariableModifiers opt Type Identifier: Expression) Statement The Expression must either have type Iterable or else it must be of an array type ( 10.1), or a compile-time error occurs. Type: Iterable<T> Navn: alle Iterator<T> iterator( ) Da kan vi si: for (T en: alle) { <gjør noe med objektet som "en" peker på> Men T må byttes ut med et ordentlig klassenavn 19

20

Type: Iterable<T> Iterator<T> iterator( ) Navn: alle Type: Iterator<T> Navn: anonym boolean hasnext ( ) T next ( ) void remove ( ) Vi kan da si: for (T en: alle) { <gjør noe med objektet som en peker på> Men T må byttes ut med et ordentlig klassenavn 21

22

Type: Iterable<T> Navn: alle Iterator<T> iterator( ) Nytt objekt eller beholderen selv Type: Iterator<T> Navn: anonym Vi kan da si: boolean hasnext ( ) T next ( ) void remove ( ) Peker "neste" på et gyldig element? Øk "neste" og returne forrige Fjern forrige neste Invariant: "neste" peker på neste element. Forandres av "next" for (T en: alle) { <gjør noe med objektet som en peker på> Men T må byttes ut med et ordentlig klassenavn 23

Iterasjon over innholdet i en generisk beholder vi lager selv n La oss starte med å gå gjennom alle elementene i en beholder som bare kan inneholde en ting void legginn (T en) T hent( ) Type: T Navn: denne Iterable<T> iterergjennomalle() Objekt av klassen T eller en subklasse av T NB! slike objekter finnes ikke!! 24

class Hoved { public static void main (String [ ] args) { EgenDefBeholder<Fisk> akvarium = new EgenDefBeholder<Fisk> (); akvarium.put(new Fisk("Dorsken")); akvarium for (Fisk f: akvarium.iterergjennomalle() ) System.out.println(f.navn); class Fisk { String navn; Fisk (String nv) {navn = nv; class EgenDefBeholder<T> { private... public void legginn(t en) {... T hent ( ) {... Iterable<T> iterergjennomalle ( ) {... void legginn (Fisk en) Fisk hent( ) Type: Fisk Navn: denne Iterable<Fisk> iterergjennomalle() 25

class Hoved { Enda klarere (?): public static void main (String [ ] args) { GenBeholderTilEn<Fisk> akvarium = new GenBeholderTilEn<Fisk> (); akvarium.put(new Fisk("Dorsken")); akvarium Itarable<Fisk> alle = akvarium.iterergjennomalle(); for (Fisk f: alle) System.out.println(f.navn); class Fisk { String navn; Fisk (String nv) {navn = nv; class GenBeholderTilEn<T> { private... public void legginn(t en) {... T hent ( ) {... Iterable<T> iterergjennomalle ( ) {... void legginn (Fisk en) Fisk hent( ) Type: Fisk Navn: denne Iterable<Fisk> iterergjennomalle() alle Iterable<Fisk> Objekt som implementerer grensesnittet Iterable<Fisk> Iterator<Fisk> iterator( ) 26

public class GenBeholderTilEn <T> { private T denne; public void legginn (T en) { denne= en; public T hent () { return denne; Gammel del public Iterable<T> iterergjennomalle() {return new Ukjent1(); private class Ukjent1 implements Iterable<T> { public Iterator<T> iterator () {return new Ukjent2(); Ny del private class Ukjent2 implements Iterator<T> { boolean fortsett = true; public boolean hasnext(){return fortsett; public T next() {fortsett = false; return denne; public void remove ( ) { class Hoved { public static void main (String [ ] ards) { GenBeholderTilEn<Fisk> ensligakvarium = new GenBeholderTilEn<Fisk> (); ensligakvarium.legginn(new Fisk("Piraja")); for (Fisk f: ensligakvarium.iterergjennomalle()) System.out.println("Fisk med navn: " + f.navn); class Fisk { String navn; Fisk(String nvn) {navn= nvn; 27

public void legginn (Fisk en) public Fisk hent( ) public Iterable<Fisk> iterergjennomalle() {return new Ukjent1(); Type: Fisk Navn: denne Iterator iterator( ) return new Ukent2(); objekt av class Ukjent1 implements Iterable<Fisk> boolean hasnext( ) Fisk next( ) void remove( ) fortsett objekt av class Ukjent2 implements Iterator<Fisk> Navn: ensligakvarium Type: GenBeholderTilEn<Fisk> Når java kjører er objektene i virkeligheten ikke inne i hverandre (men det blir letter for oss hvis vi tenker oss at de er inne i hverandre) 28

29 Iterasjon over innholdet i en større generisk beholder n Hvis vi ungår pirajaen, kan vi bruke et akvarium som kan inneholde mange fisk n Vi lager først en generisk beholder med plass til mange objekter

tenkt objekt av klassen Beholder<T> public void legginn (T en) public T hent( ) alle [antall] = peker; antall ++; antall --; return alle [antall]; public Iterable<T> iterergjennomalle() {return new Ukjent1(); Navn: antall Type: int T [ ] alle Iterator<T> iterator( ) return new Ukjent2(); objekt av class Ukjent1 implements Iterable<T> boolean hasnext( ) return teller < antall; T next( ) teller teller ++; return alle[teller-1]; void remove( ) objekt av class Ukjent2 implements Iterator<T> NB! slike objekter finnes ikke!! 30

objekt av klassen Beholder<Fisk> public void legginn (Fisk en) public Fisk hent( ) alle [antall] = peker; antall ++; antall --; return alle [antall]; public Iterable<Fisk> iterergjennomalle() {return new Ukjent1(); Navn: antall Type: int Fisk [ ] alle Iterator<Fisk> iterator( ) return new Ukjent2(); objekt av class Ukjent1 implements Iterable<Fisk> boolean hasnext( ) return teller < antall; Fisk next( ) teller teller ++; return alle[teller-1]; void remove( ) objekt av class Ukjent2 implements Iterator<Fisk> NB! slike objekter finnes!! 31

class Hoved{ public static void main (String [ ] ards) { new Hoved ( ); Hoved() { String [ ] allenavn = { "Langen", "Slanken", "Lynet", "Latsabb, "Dorsken", "Storhodet"; Beholder<Fisk> akvarium = new Beholder<Fisk>(); for (int i = 0; i < 6; i++) { Fisk f = new Fisk(alleNavn[i]); akvarium.legginn(f); for (Fisk fsk: akvarium.iterergjennomalle()) System.out.println("Fisk med navn: " + fsk.navn); class Beholder<T> { int antall = 0; T[] alle = (T[]) new Object[100]; void legginn(t peker) {alle [antall] = peker; antall ++; T hent () {antall --; return alle [antall]; Iterable<T> iterergjennomalle() {return new Ukjent1(); class Ukjent1 implements Iterable<T> { public Iterator<T> iterator () {return new Ukjent2(); class Ukjent2 implements Iterator<T> { int teller = 0; public boolean hasnext(){return teller < antall; public T next() {teller ++; return alle[teller-1]; public void remove ( ) { class Fisk { String navn; Fisk(String nvn) {navn = nvn; 32

class Hoved { public static void main (String [ ] ards) { String [ ] navn = { Ole", "Per", "Paal", "Eva", "Else"; for (String s: navn) System.out.println(s); import java.util.iterator; Repetisjon Ikke nytt Enkel måte å gå gjennom en String-tabell Komplisert måte å gå gjennom en String-tabell class Hoved2 { public static void main (String [ ] ards) { new Hoved2 ( ); Hoved2() { for (String s: new Ukjent1()) { System.out.println(s); String [ ] navn = { "Ole", "Per", "Paal", "Eva", "Else"; class Ukjent1 implements Iterable<String> { public Iterator iterator () {return new Ukjent2(); class Ukjent2 implements Iterator<String> { int teller = 0; public boolean hasnext(){return teller!= navn.length; public String next() {teller ++ ; return navn[teller-1]; public void remove ( ) { Nytt i dag Slike indre klasser (som ikke er static ) finnes bare inne i objekter (ikke inne i klassedatastrukturer) 33

HashMap og grensesnittet Collection public interface Collection<E> extends Iterable<E> {..... class HashMap<K,V>... { <Hemmelig datastruktur> private class Ukjent1 implements Collection<V> {... private class Ukent2 implements Iterator <V> {... public void put(k nokkel, V verdi ){...... public Collection<V> values( ) { Ukjent1<V> u = new Ukjent1<V> ( ) ;... return u;... HashMap har altså sine egen implementasjon av Collection som er hemmelig for oss utenfor 34

Eks. implementasjon av HashMap HashMap<String, Dokument> alledokumenter void visalledokumenter() for (Dokument d: alledokumenter.values()) { d.vispaaskjerm(); d objekt av class Ukjent1 implements Collection<Dokument> Iterator<Dokument> iterator( ) Collection<Dokument> values() boolean hasnext( ) Dokument next( ) objekt av class Ukjent2 implements Iterator<Dokument> Dokument-objekt 35