Title: Kun til bruk i tilknytning til l
1Tabell-lister og programmering av assosiasjoner
Hva er en tabell-liste? side 2-3 Et aggregat
med tabell-liste side 4Hvordan lagre tall i
en tabell-liste? side 5-6Wrapperklassene
Integer, Double, m.fl. side 7Omforming
primitive datatyper ? wrapperobjekt side
8 Assosiasjoner side 9 Oppussingseksemplet,
del 2 side 10 Å programmere aggregeringer og
assosiasjoner side 11-13 Interfacet Comparable
og sortering av objekter side 14 Interfacet
Comparator og sortering av tekster side 15
2Hva er en tabell-liste?
- Vanlige tabeller er lite fleksible. Kan ikke
endre størrelsen etter at tabellen er opprettet. - Klassen java.util.ArrayList.
- Innebygget en tabell av referanser.
- Klassen vedlikeholder størrelsen på denne
tabellen etter behov. - Klassen holder orden på hvor stor del av tabellen
som til enhver tid inneholder fornuftige data. - Konstruktør
- public ArrayListltTypegt() - elementtypen oppgis
i spissparentesene - En tabell-liste av String-referanser lages slik
- ArrayListltStringgt navnene new
ArrayListltStringgt() - Aktuelle metoder
- boolean add(Type obj) - sett inn en referanse
- Type get(int indeks) - hent en referanse
- Type remove(int indeks) - fjern en referanse
- int size() - størrelsen
- Dersom ugyldig indeks, kastes IndexOutOfBoundsExce
ption - Dersom en parameter er av typen Object, kan
argumentet være av en hvilken som helst
referansetype. - Dersom returtypen fra en metode er Object, må vi
caste returobjektet til riktig klasse, før vi kan
sende meldinger til det.
3Eksempel
import java.util.ArrayList import static
javax.swing.JOptionPane. class
TabellListeAvNavn public static void
main(String args) ArrayListltStringgt
navnene new ArrayListltStringgt() // trenger
ikke å tenke på størrelsen String navn
showInputDialog("Oppgi navn (avslutt med blank)
") navn navn.trim() while
(!navn.equals("")) navnene.add(navn) //
add() er en metode i klassen ArrayList navn
showInputDialog("Oppgi navn (avslutt med
blank) ") navn navn.trim()
/ Henter ut og skriver ut alle navnene ved å
bruke en vanlig for-løkke. / for (int i 0
i lt navnene.size() i) String
detteNavnet navnene.get(i)
System.out.println(detteNavnet) /
Henter ut og skriver ut alle navnene ved å bruke
utvidet for-løkke. / for (String detteNavnet
navnene) System.out.println(detteNavnet)
Oppgave Tegn en figur som viser alle referanser
og objekter i dette eksemplet.
Gjør alle oppgavene side 328.
4Et aggregat med tabell-liste
rollenavn
Fag
Fagkatalog
fagene
fagkode fagnavn antSp
registrerNyttFag finnAntallFag finnFag sorterFag
1
finnFagkode finnFagnavn finnAntStudiepoeng
multiplisitet
Vis programliste 9.2, side 329-330 sammen med
programliste 7.9, side 281-284
5Hvordan lagre tall i en tabell-liste?
- Elementene i en tabell-liste må være referanser.
- Ofte behov for å lagre tall i en tabell-liste.
- Klassene Integer, Double osv. pakker en verdi av
en primitiv datatype inn i et objekt, derav
betegnelsen wrapperklasse (innpakning er
egentlig ikke spesielt for disse klassene, alle
klasser pakker inn noe). - Referanser til disse objektene kan lagres i
tabell-liste. - Eksempel
- Integer heltallsobjekt new Integer(50) //
lager et objekt med innhold 50 - int etTall heltallsobjekt.intValue() // henter
ut tallverdien fra objektet - Kortform
- Integer heltallsobjekt 50
- int etTall heltallsobjekt
- Dvs. automatisk omforming mellom en primitiv
datatype og et objekt av den tilsvarende
wrapperklassen.
6Tabell-liste med tall, eksempel
- import java.util.ArrayList
- import static javax.swing.JOptionPane.
- class TabellListeAvTall
- public static void main(String args)
- ArrayListltDoublegt tallene new
ArrayListltDoublegt() - / Leser inn og lagrer tallene i
tabell-listen / - String tallLest showInputDialog("Oppgi et
tall (avslutt med blank) ") - while (!tallLest.equals(""))
- double tall Double.parseDouble(tallLest)
- tallene.add(tall) // egentlig
tallene.add(new Double(tall)) - tallLest showInputDialog("Oppgi et tall
(avslutt med blank) ") -
- / Viser alle tallene i tabell-listen.
Summerer dem. / - System.out.print("Finner følgende tall ")
- double sum 0
- for (double etTall tallene) // utvidet
for-løkke - sum etTall
7Wrapperklassene Integer, Double, m.fl.
- Klassenavn Integer, Long, Float, Double, Byte,
Character og Boolean - Klassene tilhører pakken java.lang.
- Alle klassene er immutable.
- Alle klassene har konstruktør som tar en verdi av
den tilhørende primitive datatypen som argument. - Alle klassene, unntatt Character, har en
konstruktør som tar en streng som argument.
Konstruktøren kaster NumberFormatException dersom
det ikke er mulig å omforme strengen til den
aktuelle datatypen. - Eksempel, klassen Integer
- Integer(int verdi)
- Integer(String s) throws NumberFormatException
- String toString()
- static int parseInt(String s) throws
NumberFormatException - static String toString(int i)
String t "234_567" try int
tall Integer.parseInt(t)
System.out.println("Tallet er " tall)
catch (NumberFormatException e)
System.out.println("Kan ikke omforme "
t " til tall") System.out.println(
e)
- Utskrift
- Kan ikke omforme 234_567 til tall
- java.lang.NumberFormatException 234_567
Gjør oppgave 1 side 333.
8Automatisk omforming mellom primitiv datatype og
wrapperobjekt
- Automatisk omforming mellom en primitiv datatype
og et objekt av den tilsvarende wrapperklassen - skjer ved tilordning, i uttrykk, ved metodekall
- Omforming fra primitiv datatype til objekt kalles
boxing conversion eller autoboxing - Omforming fra objekt til primitiv datatype kalles
unboxing conversion eller auto-unboxing - Eksempler
- Double t1 new Double(4.5)
- Double t2 new Double(25)
- Kalkulator kalk new Kalkulator(t1, t2) //
auto-unboxing (side 170) - Double sum kalk.beregnSum() // auto-boxing
- double svar1 (t1 t2) / 100 // auto-unboxing
- Double svar2 (t1 t2) / 100 // auto-unboxing
etterfulgt av auto-boxing
9Assosiasjoner
1
Leilighet
Person
en-til-mange-assosiasjon
bebos av
Kontor
1
1
Person
en-til-en-assosiasjon
har plass på
Forfatter
Bok
1..
1..
mange-til-mange-assosiasjon
er skrevet av
navn med leseretning
10Oppussingseksemplet, del 2
bruker
Flate
navn String lengde double bredde double
1
Oppussingsprosjekt
1
Maling
navn String
består av
finnNavn() finnLengde() finnBredde() finnMaling()
settMaling( nyMaling Maling) finnAreal() finnOm
krets()
navn String pris doubleantStrøk
int antKvmPrLiter double
finnNavn() registrerNyFlate( nyFlate
Flate) finnFlate(navn String) finnAntFlater() fin
nFlate(indeks int) registrerNyMaling(
nyMaling Maling) finnMaling(navn
String) finnAntMalinger() finnMaling(indeks
int) finnTotalpris()
finnNavn() finnPrisPrLiter() finnAntStrøk() finnAn
tKvmPrLiter() finnAntLiter( enFlate
Flate) finnTotalpris ( enFlate Flate)
1
trenger
11Å programmere aggregeringer og assosiasjoner
- To en-til-mange-aggregeringer. Kan betraktes som
registre. - Programmeres ved å lage tabell-lister i
aggregat-klassen. - Tabell-listene inneholder referanser til
objektene som inngår i aggregatet. - class Oppussingsprosjekt
- private String navn
- private ArrayList ltFlategtalleFlater new
ArrayListltFlategt() - private ArrayList ltMalinggtalleMalingstyper
new ArrayListltMalinggt() - En-til-mange-assosiasjon fra Maling til Flate.
- Trenger et malingsobjekt å vite om alle flatene?
Lag tabell-liste i klassen Maling. - Trenger et flate-objekt å vite om
malings-objektet? Lag en referanse i klassen
Flate. - Det siste er nok
- class Flate
- private String navn
- private double lengde
- private double bredde
- private Maling malingstype
- Assosiasjoner og aggregeringer programmeres på
samme måte. - For å kode komposisjoner må vi ta spesielle
hensyn, se kapittel 8.
12Hvilke oppgaver må en klasse som har ansvaret for
å vedlikeholde et register kunne utføre?
- En klient må kunne få utført følgende oppgaver
- Å legge inn et nytt element i registeret.
- Å se på de elementene som er lagt inn. Søking på
f.eks. navn. Bør også kunne løpe gjennom alle ved
hjelp av en indeks. - Eventuelt å slette et element.
- Dette gjelder generelt, vi skal som eksempel se
på registrene i oppussingsprosjektet.
13Vis programliste 9.4 side 337-340 ogprogramliste
9.5 side 340-342.
Tegn en figur som viser alle objekter og
referanser som opprettes når programliste 9.5
kjøres.
Gjør oppgavene side 342.
14Interfacet Comparable og sortering av objekter
- Et interface er en samling med metodehoder.
- En klasse kan velge å implementere et interface.
Den må da inneholde kode for alle metodene i
interfacet. - Eksempel på interface
- public interface Comparable // tilhører
pakken java.lang - public int compareTo(Type obj) // dette har
vi sett før! -
- For å bruke biblioteksmetoder til sortering av
objekter må klassen objektene tilhører
implementere interfacet Comparable. - Dermed kan sorteringsmetodene bruke compareTo()
til å sammenligne objektene.
Vis programlistene 9.6 og 9.7, sidene 343-347.
15Interfacet Comparator og sortering av tekster
- Klassen String implementerer Comparable
- Ikke godt nok! Iallfall ikke for norske forhold.
- Trenger et objekt som inneholder riktig
sorteringsrekkefølge. - Et slikt objekt kan tilhører en klasse som
implementerer Comparator - public interface ComparatorltTypegt
- / sammenligner to objekter, merk forskjellen
fra Comparable / - int compare(Type o1, Type o2) // OBS! Her er
metoden vi skal bruke - / sammenligner to objekter av klasser som
implementerer Comparator / - boolean equals(Object obj)
-
- Klassen Collator implementerer dette interfacet
for tekster, og slik at sorteringsrekkefølgen er
i henhold til gitt lokalisering. - Kan bruke denne i egne sorteringsmetoder, og i
bibliotekmetoder for sortering og søking. - Vis programlistene 9.8, 9.9 og 9.10, sidene
348-352.
Gjør oppgavene side 352.