dagens forelesning

23
1 Dagens forelesning Kort repetisjon om collection- rammeverket Collection-, List- og Set-grensesnittene Bruk av <type>-deklarasjoner ifm. collections • Iterator-teknikken Hva er en Iterator og hvorfor bruke den? Hvordan virker en Iterator? Vi lager en Iterator for tegnene i en String Iterable-grensesnittet og for-løkker Eksempel med bruk av Collection-, Iterator og Iterable-grensesnittene – Highscoreliste-implementasjon

Upload: hallvard

Post on 18-Nov-2014

115 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Dagens Forelesning

1

Dagens forelesning

• Kort repetisjon om collection-rammeverket– Collection-, List- og Set-grensesnittene

– Bruk av <type>-deklarasjoner ifm. collections

• Iterator-teknikken– Hva er en Iterator og hvorfor bruke den?

– Hvordan virker en Iterator?Vi lager en Iterator for tegnene i en String

– Iterable-grensesnittet og for-løkker

• Eksempel med bruk av Collection-, Iterator og Iterable-grensesnittene– Highscoreliste-implementasjon

Page 2: Dagens Forelesning

2

Grupper av objekter

• En har ofte behov for å håndtere grupper av objekter– operere på dem som et hele, f.eks. overføre dem som parameter

eller gjøre enkeltoperasjoner på alle ved hjelp av en løkke– implementere relasjon/kobling fra ett objekt til mange andre– finne et objekt som tilfredsstiller visse kriterier

• Java-tabeller (array) kan brukes til dette, men de er lite fleksible og tilbyr ingen hjelpemetoder– Tabeller har fast lengde angitt av length-attributtet og kun

muligheten til å lese og sette elementer basert på en indeks (int).

Page 3: Dagens Forelesning

3

Collection-rammeverket, kap. 22(http://java.sun.com/j2se/1.5/docs/guide/collections/overview.html)

• Collection-rammeverket i java.util-pakken implementerer mange måter å lagre og bearbeide grupper av objekter– java.util.ArrayList lar oss f.eks. legge til, hente ut og ta ut objekter

• Mange grensesnitt med tilhørende implementasjoner metoder gjør jobben lettere, så det er lurt å bli kjent med Collection-API’et (API = Application Programmers Interface)

Page 4: Dagens Forelesning

4

Oppbyggingen tilCollection-rammeverket (1)

• Collection rammeverket består av ett overordnet grensesnitt (Collection) og mange spesifikke grensesnitt, som tilbyr ”samlinger” med ulik logikk– Collection-grensesnittet spesifiserer generelle metoder som de

andre grensesnittene arver fra/utvider– List-grensesnittet tilbyr posisjonsbaserte metoder– Set-grensesnittet tilbyr ingen egne metoder, men begrenser

samlingen til ikke å inneholde duplikater. SortedSet-grensesnittet støtter sortering basert på en spesifikk måte å sammenligne elementer på (Comparator)

Page 5: Dagens Forelesning

5

Eksempel på bruk av <type>

// lag og bruk en String-liste

// både deklarasjon og new-uttrykk begrenses

List<String> stringListe = new ArrayList<String>();

// String-lista sin add-metode krever et String-argument

stringListe.add(”En string”);

stringListe.add(”Enda en string”);

int pos = stringListe.indexOf(”En string”);

// get-metoden returnerer nødvendigvis en String

String enString = stringListe.get(pos);

Page 6: Dagens Forelesning

6

java.util.IteratorEt standard Java-grensesnitt

for iterasjon

Page 7: Dagens Forelesning

7

java.util.Iterator –hva og hvorfor

• Å bruke ulike Collection-grensesnitt (List, Set, …) krever ofte at en itererer (går gjennom) alle elementene som Collection-objektet refererer til

• Iterasjon med List:

List objekter = ...for (int i = 0; i < objekter.size(); i++) {

Object o = objekter.get(i);System.out.println(”Neste: ” + o);

}

• Eksempel på indeksbasert iterasjon– int-variabel brukes som løkkevariabel

– bruker løkkevariabel for å hente ut objekt

Page 8: Dagens Forelesning

8

Men hva gjør en med generelle Collection-objekter?

Iterator-teknikken/grensesnitt gir en uniform måte å

iterere over elementer

Page 9: Dagens Forelesning

9

java.util.Iterator• En såkalt iterator er et objekt som ”genererer” objekter

– iterator.hasNext() sier om det er flere objekter å generere– iterator.next() genererer neste objekt (en gang for alle)

• Kode-eksempel:

List<Person> personer = ...Iterator<Person> it = personer.iterator();while (it.hasNext()) {

Person p = it.next();System.out.println(”Neste: ” + p);

}

Page 10: Dagens Forelesning

10

java.util.Iterator

• Iteratoren ”husker” hvor langt i lista en er kommet– hasNext() returnerer true så lenge vi ikke har kommet

gjennom hele lista– next() vil hver gang returnere neste element og flytte

seg et trinn utover i lista

• iterator()-metoden er definert i Collection-grensesnittet– alle List-implementasjoner har den– også Set-implementasjoner definerer den

Page 11: Dagens Forelesning

11

objekter: List

get(0)size()

Sekvensdiagram for iterasjon med List

get(1)size()

get(2)size()

size()

Page 12: Dagens Forelesning

12

it: Iterator objekter: List

hasNext()next() get(0)

size()

Sekvensdiagram for iterasjon med Iterator

hasNext()next() get(1)

size()

hasNext()next() get(2)

size()

hasNext() size()

...

Page 13: Dagens Forelesning

13

Et Iterator-objekt husker hvor langt vi er kommet, og bruker den

underliggende lista til å- sjekke om vi er ferdig og

- hente ut neste element

Hvorfor introdusere en slik teknikk, den er jo ikke noe lettere å bruke?

Page 14: Dagens Forelesning

14

Bruk av iterator

• Uniform måte å iterere over en samling objekter– Uavhengig av om det er en posisjonsbasert List-

implementasjon eller kun en Collection– Uavhengig av metode som benyttes for å hente ut

objekter (tabell[i] eller list.get(i))

• Gir mindre avhengighet mellom kode som aksesserer en samling og kode som implementerer en samling

Page 15: Dagens Forelesning

15

Iterasjon vha. for

• Den vanligste måten å iterere er vha. avfor og en løkkevariabel av typen int:

// Kode for å finne et bestemt element:Person[] personer = ...

// Vi skal se etter en person med navn// ”Jan Johansen” for (int i = 0; i < personer.length; i++) {

Person p = personer[i];if (”Jan Johansen”.equals(p.getName())) {

// send e-post til Christine Koht...

}}

Page 16: Dagens Forelesning

16

Standard løkkestruktur

• Løkka inneholder typisk kode som:– håndterer løkkevariabelen (for-løkker skiller tydelig mellom disse

tre elementene, mens while-løkker har dem mer implisitt)• deklarerer løkkevariabelen og gir den en initialverdi: int i = 0• sjekker om løkka skal gjentas: i < personer.length• beregner neste verdi for løkkevariabelen (i++ / i+=1 / i=i+1)

– håndterer objektet for hver runde i løkka• identifiserer hvilket objekt som skal behandles:Person p = personer[i]

• bruker evt. manipulerer objektetif (”Jan Johansen”.equals(p.getName())) { ... }

Page 17: Dagens Forelesning

17

Standard løkkestruktur

• Viktig observasjoner:– De først fire punktene (init, test, steg, objekt) er

avhengig av hva vi itererer over– Kun det siste punktet (løkkekropp) er avhengig av hva

vi ønsker å gjøre– En iterator innkapsler de fire første punktene, slik at

løkka blir uavhengig av hva vi itererer over.– Kompleksiteten i løkka dyttes inn i iterator-objektet og

dermed over på iterator-koderen.– Alle datastrukturer burde ha en tilhørende iterator-

klasse, som f.eks. ArrayList har, og en iterator()-metode.

Page 18: Dagens Forelesning

19

Iterasjon over personer-liste(List<Person> personer)

• Kode for å finne et bestemt element:

List<Person> personer = ... // Vi skal se etter personer med navn// ”Jan Johansen”for (int i = 0; i < personer.size(); i++) {

Person p = personer.get(i);if (”Jan Johansen”.equals(p.getName())) {

// send e-post til Christine Koht...

}}

Page 19: Dagens Forelesning

21

Iterasjon over personer-listemed Iterator<Person>

• Kode for å finne et bestemt element:

List<Person> personer = ... // Vi skal se etter personer med navn// ”Jan Johansen”Iterator<Person> it = personer.iterator();while (it.hasNext()) {

Person p = it.next();if (”Jan Johansen”.equals(p.getName())) {

// send e-post til Christine Koht...

}}

Page 20: Dagens Forelesning

22

Iterable (1)

• Iterable er et grensesnitt som kun tilbyr én metode: iterator()• Enkelt sagt så implementeres det av klasser som tilbyr noe å iterere over.• En kan da bruke en spesiell for-variant for iterasjon:

List<Person> personer = ... for (Person person: personer) {

...}

• Samme som

List<Person> personer = ... Iterator<Person> it = personer.iterator();while (it.hasNext()) {

Person person = it.next();...

}

Page 21: Dagens Forelesning

23

Iterable (2)

• Generell form

Iterable<X> xer = ... for (X x: xer) {

...}

• Samme som

Iterable<X> xer = ... Iterator<X> it = xer.iterator();while (it.hasNext()) {

X x = it.next();...

}

Page 22: Dagens Forelesning

24

Iterable (3)

• Ved å implementere iterable i egne klasser,så kan en bruke denne for-varianten til iterasjon

class Person implements Iterable<Person> {private List<Person> children;public Iterator<Person> iterator() {

return children.iterator();}

}

• Kan da bruke:

Person father = ... for (Person child: father) {

// kode som bruker child...

}

Page 23: Dagens Forelesning

25

Læringsmål for forelesningen

• Objektorientering– Bruk av grensesnitt og implementasjoner i Collection-

klasser

• Java-programmering– Collection-rammeverket og

iterasjon med Iterator og Iterable

– Bruk av <type>-deklarasjoner ifm. collections(såkalte ”generics”).

• Eclipse– Kodemaler for for-konstruksjonen