dagens forelesning
TRANSCRIPT
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
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).
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)
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)
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);
6
java.util.IteratorEt standard Java-grensesnitt
for iterasjon
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
8
Men hva gjør en med generelle Collection-objekter?
Iterator-teknikken/grensesnitt gir en uniform måte å
iterere over elementer
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);
}
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
11
objekter: List
get(0)size()
Sekvensdiagram for iterasjon med List
get(1)size()
get(2)size()
size()
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()
...
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?
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
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...
}}
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())) { ... }
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.
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...
}}
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...
}}
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();...
}
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();...
}
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...
}
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