Dagens Forelesning
Transcript of Dagens Forelesning
![Page 1: Dagens Forelesning](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/1.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/2.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/3.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/4.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/5.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/6.jpg)
6
java.util.IteratorEt standard Java-grensesnitt
for iterasjon
![Page 7: Dagens Forelesning](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/7.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/8.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/9.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/10.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/11.jpg)
11
objekter: List
get(0)size()
Sekvensdiagram for iterasjon med List
get(1)size()
get(2)size()
size()
![Page 12: Dagens Forelesning](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/12.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/13.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/14.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/15.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/16.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/17.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/18.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/19.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/20.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/21.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/22.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022061119/546a6f22b4af9f86648b4635/html5/thumbnails/23.jpg)
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