1 16-collection-rammeverket.pdf

Læringsmål for forelesningen
• Objektorientering
– Bruk av grensesnitt og implementasjoner i Collection-klasser
• Java-prog, kap. 14-16 i Big Java
– Og side 990-997 i Appendix D
– Collection-rammeverket og
iterasjon med Iterator og Iterable
– Bruk av <type>-deklarasjoner ifm. collections
(såkalte ”generics”).
• Eclipse
– Kodemaler for for-konstruksjonen
1
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).
2
Collection-rammeverket, kap. 15
(http://java.sun.com/j2se/1.5/docs/guide/collections/overview.html)
Forbedringer i Java7: Se side 650-651 (og 990-997) i Big Java
• 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)
3
Oppbyggingen til
Collection-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)
4
Oppbyggingen til
Collection-rammeverket (2)
• Hvert spesifikke grensesnitt har flere
implementasjoner, hvorav en er
”standardimplementasjonen”
– List sin standardimplementasjon er ArrayList, Set sin er HashSet, ...
• Utenom Collection-hierarkiet har en i tillegg noen
nyttige grensesnitt/klasser
– Map: oppslag fra et objekt (nøkkel) til et annet objekt (verdi)
– Stack: stabel med verdier, med operasjoner for å legge på og ta av toppen
– Queue: kø med verdier, med operasjoner for å fylle på i én ende og ta ut i andre
5
http://www.falkhausen.de/en/diagram/html/java.util.Collection.html
6
Før en velger hvilken type
Collection en trenger, må en vurdere
behovene...
Avdekking av behovene er alltid viktig.
Det gjelder å stille de riktige spørsmålene.
7
Behov vs. tilbud
• Duplikater
– Skal en potensielt kunne lagre flere av samme element?
– Bruk en implementasjon av List-grensesnittet.
• Rekkefølge
– Er rekkefølgen eller posisjonen viktig?
– Dersom elementene skal ha en spesiell rekkefølge, kan en ikke bruke en Setimplementasjon.
– Er innsettingsrekkefølgen eller –posisjonen viktig?
– Bruk en List-implementasjon.
• Sortering
– Ønskes elementene automatisk sortert?
– Bruk en SortedSet-implementasjon.
• Trenger en spesielle håndteringsoperasjoner
– sette inn og ta ut i bestemt rekkefølge (siste/først inn, først ut)
• Som regel er det greit å bruke List/ArrayList,
men still deg likevel spørsmålene først!
8
– F.eks. viktig å vite om en må bruke list.contains(element) før list.add(element)
– Side 651 i Big Java
Collection-grensesnittet
•
Collection-grensesnittet tilbyr generelle metoder,
bl.a. for å legge til, fjerne og spørre om elementer
–
–
–
•
•
•
•
Støtter ikke oppslag basert på indeks og dermed ikke iterasjon basert
på for (int i = 0; i < col.size(); i++) { .. }
Iterasjon gjøres vha. såkalte iteratorer (Iterator-grensesnittet), som vi
kommer nærmere inn på etterhvert.
Det finnes ingen klasser som kun implementerer Collection, alle
konkrete klasser implementerer en av de mer spesifikke
grensesnittene.
Det kan likevel være riktig å deklarere variabler som Collection, for å
markere at det kun brukes Collection-metoder.
–
9
add(Object), addAll(Collection)
remove(Object), removeAll(Collection) (retainAll(Collection) – fjern alt annet enn)
contains(Object), containsAll(Collection)
// koden bruker kun add, remove, size, samt iterator
Collection col = new ArrayList();
List-grensesnittet –
posisjonsorientert
Collection
•
List-grensesnittet utvider
Collection-grensesnittet med
indeksbaserte metoder
for å legge til, fjerne og spørre om elementer
–
–
–
•
Viktigst er muligheten til å lese og sette elementer
basert på indeks/posisjon
–
•
•
•
Object get(int), set(int, Object)
Støtter dermed også iterasjon basert på indeks, som i
for (int i = 0; i < list.size(); i++) { .. }
Iterasjon kan også gjøres vha. Iterator-grensesnittet.
ArrayList er standardimplementasjonen av List-grensesnittet
–
10
add(int, Object), addAll(int, Collection)
remove(int)
int indexOf(Object), int lastIndexOf(Object)
Du skal ha god grunn til å velge en annen implementasjon.
Bruk av List (ArrayList)
• add(object) – legger til objekt
• get(int) – henter objekt med gitt indeks
• size() – størrelsen på lista
11
List-grensesnittet
(posisjon og duplikater)
this
arg
overlapp
.addAll(
12
samme relative
posisjon og rekkefølge
)=>
.removeAll(
)=>
.retainAll(
)=>
this
etterpå
Set-grensesnittet
(ingen posisjon, ikke duplikater)
this
arg
overlapp
.addAll(
13
potensielt stokket
eller sortert
)=>
.removeAll(
)=>
.retainAll(
)=>
this
etterpå
add-metoden
• skyter et objekt inn mellom de andre
• objektene med høyere indeks forskyves og endrer
posisjon 0
i-1 i i+1
nytt element
0
i-1
i i+1
• add uten indeks legger til på slutten
nytt element
14
remove-metoden
• fjerner et element
• lista klemmes sammen
• to varianter:
– fjern bestemt objekt
– fjern objekt på bestemt posisjon
skal fjernes
15
0
i-1
i i+1
0
i-1
i
Konvertering mellom
List og tabell
• Hvordan lage en List fra en tabell
– Arrays.asList(T[] tab) returnerer en List<T> med tab som innhold, og
som ikke kan endres.
– ArrayList har en konstruktør som initialiserer den med innholdet til en
eksisterende Collection.
– Card[] cards = …
List<Card> cardList =
new ArrayList<Card>(Arrays.asList(cards));
• Hvordan lage en tabell fra en List
– List.toArray(T[] t) returnerer t fylt med lista sitt innhold.
– List<Card> cardList = …
Card[] cards = new Card[cardList.size()];
cardList.toArray(cards);
16
Collection-klasser (inkl. Iterator)
og (parameter- og resultat)typer
•
•
•
Når en bruker en Collection i praksis, er elementene en legger inn og tar
ut ofte av en spesifikk type, f.eks. String eller Person.
Likevel må en i utgangspunktet bruke casting når en henter ut
elementer, f.eks. Person p = (Person)liste.get(i)
Ved å konsekvent deklarere Collection-, List-, Iterator- og Iterablevariabler med <type> bak, forteller vi at klassen er begrenset til å kun
behandle objekter av denne spesifikke typen (eller subtyper):
List<String> tekst = new ArrayList<String>();
// add tar inn en String, og det vet Java!
tekst.add(”En String”);
// get returnerer String, og
// det skjønner også Java!
String s1 = tekst.get(0);
17
Collection-klasser (inkl. Iterator)
og (parameter- og resultat)typer
• <type>-deklarasjoner bestemmer/begrenser
parametertypen/returtypen til metoder som
add, remove, get, next, iterator osv.
• <type>-deklarasjoner er lov etter List,
ArrayList, Iterator, Iterable og generelt de
fleste klasser i Collection-rammeverket.
• Bruk alltid <type> bak, så blir koden sikret
mot en viktig type type-feil.
18
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);
19
Map-grensesnittet
• Map<K,V> er en spesiell type samling (ikke en
Collection) som brukes til tabelloppslag, dvs. når
en ønsker å finne et objekt, basert på et annet
– Map brukes typisk når en koblingen mellom objekter er temporær
K
V
En map implementerer en
matematisk funksjon:
avbildning fra et
nøkkelsett til et verdisett
• Metoder:
20
–
–
–
–
–
put(K key, V verdi) – knytter key til verdi
V get(Object key) – returnerer verdien som er knyttet til key
boolean containsKey(Object key) – sier om key finnes i nøkkelsettet
Set<K> keySet() – settet av nøkler
Collection<V> values() – samlingen av verdier
21
http://www.falkhausen.de/en/diagram/html/java.util.Map.html
Stack-klassen
• Stack<T>-klassen implementerer en
stabel, dvs. en samling med egne
operasjoner for å legge på og ta av fra
toppen
– push(T t) – legger t på toppen
– T pop() – tar bort og returnerer øverste element
– T peek() – returnerer øverste element, uten å ta det bort
22
Queuegrensesnittet
• Queue<T>-grensesnittet spesifiserer
metoder for en kø, dvs. en samling
med egne operasjoner for å legge til i
ene enden og ta ut i andre
– offer(T t) – legger t til inn-enden
– T poll() – tar ut (fjerne) et element i ut-enden
– T peek() – returnerer elementet i ut-enden, uten å fjerne
det
23
• Implementeres av LinkedList
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
24