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
6 http://www.falkhausen.de/en/diagram/html/java.util.collection.html
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) 8 Som regel er det greit å bruke List/ArrayList, men still deg likevel spørsmålene først! 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 add(object), addall(collection) remove(object), removeall(collection) (retainall(collection) fjern alt annet enn) contains(object), containsall(collection) 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. // koden bruker kun add, remove, size, samt iterator Collection col = new ArrayList(); 9
List-grensesnittet posisjonsorientert Collection List-grensesnittet utvider Collection-grensesnittet med indeksbaserte metoder for å legge til, fjerne og spørre om elementer add(int, Object), addall(int, Collection) remove(int) int indexof(object), int lastindexof(object) 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 Du skal ha god grunn til å velge en annen implementasjon. 10
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( )=>.removeall( )=> samme relative posisjon og rekkefølge this etterpå.retainall( )=> 12
Set-grensesnittet (ingen posisjon, ikke duplikater) this arg overlapp.addall( )=>.removeall( )=> potensielt stokket eller sortert this etterpå.retainall( )=> 13
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 0 i-1 i i+1 15 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 20 Metoder: 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
Queue- grensesnittet 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