Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon 2001-05-16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon 2001-05-16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."— Utskrift av presentasjonen:

1 Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10 Tabeller av referansetyper og tabell-lister Tabell av referansetypeside 2-4 Tabell-liste (ArrayList)side 5-6 Wrapperklasser for primitive datatyperside 7-8 Metodene equals() og toString()side 9 Assosiasjoner / registreside Interfaceside 16 Ferdige sorterings- og søkemetoder, med Comparableside Et alternativ til Comparableside 19 Sortering av tekster i hht. norsk tegnsettside 20 Ferdige sorterings- og søkemetoder, med Comparatorside 21

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 2 En tabell av referanser, eksempel strenger –Hvert enkelt element i tabellen består av en referanse til String: •String[] navneliste = new String[4]; –Dette er en tabell av referanser. Hver enkelt av disse referansene må vi sette til å peke til objekter av klassen String: •navneliste[0] = new String(”Anne”); •navneliste[1] = ”Berit”; // kortform går bra –Objektet kan også være retur fra en metode som lager et String-objekt: •navneliste[2] = gui.lesTekst(”Skriv et navn”); •navneliste[3] = navneliste[0].toUpperCase(); –Kan også skrive: •String[] navneliste = {”Anne”, ”Berit”, ”Åge”, ”ANNE”}; navneliste AnneBeritÅgeANNE

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 3 Å kopiere en tabell av referanser fører ikke til at objektene kopieres navneliste AnneBeritÅgeANNE navnelisteKopi String[] navnelisteKopi = new String[4]; for (int i = 0; i < navneliste.length; i++) { navnelisteKopi[i] = navneliste[i]; }

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 4 Forskjeller mellom tabeller av primitive datatyper og tabeller av referansetyper •En tabell av en primitiv datatype: –Elementene i tabellen inneholder dataverdiene. –Dataverdiene kopieres dersom tabellen kopieres element for element. –Elementene kan sammenlignes ved å bruke sammenligningsoperatorene. –Elementene initieres til 0 (ev. false) dersom ikke andre verdier gis i deklareringen av tabellen. •En tabell av en referansetype: –Elementene i tabellen inneholder ikke objektene, men referanser til objektene. –Dersom tabellen kopieres element for element, blir bare referansene kopiert, ikke objektene. Element med samme indeks i begge tabellene peker til det samme objektet. –Med unntak av lik (==) og ikke lik (!=) kan vi ikke bruke sammenligningsoperatorer på referanser. Operatorene lik og ikke lik sammenligner innholdet i referansene, ikke i objektene som referansene peker til. –Elementene initieres til null, dersom ikke andre verdier gis i deklareringen av tabellen. Dersom vi prøver å bruke et tabellelement som ikke refererer til noe objekt, kastes NullPointerException. Gjør oppgavene 1-4 side 262.

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 5 Hva 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. •Aktuelle metoder: –boolean add(Object obj) - sett inn en referanse –Object get(int indeks) - hent en referanse –Object remove(int indeks) - fjern en referanse –int size() - størrelsen •Dersom ugyldig indeks, kastes IndexOutOfBoundsException •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.

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 6 Eksempel import java.util.*; class TestTabellListe { public static void main(String[] args) { String navn1 = new String("Ole Petter"); String navn2 = new String("Inger"); String navn3 = new String("Anne Beate"); ArrayList navn = new ArrayList(); navn.add(navn1); navn.add(navn2); navn.add(navn3); for (int i = 0; i < navn.size(); i++) { String etNavn = (String) navn.get(i); System.out.println(etNavn); } /* Utskrift: Ole Petter Inger Anne Beate */ Oppgave: Tegn en figur som viser alle referanser og objekter i dette eksemplet. Gjør alle oppgavene side

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 7 Hvordan 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 •Leser inn positive tall fra brukeren, og lagrer tallene i en tabell-liste: ArrayList tall = new ArrayList(); int etTall = gui.lesHeltall("Wrapperprogram", "Skriv et positivt tall: "); while (etTall > 0) { Integer heltallsobjekt = new Integer(etTall); tall.add(heltallsobjekt); etTall = gui.lesHeltall("Wrapperprogram", "Skriv et positivt tall: "); }

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 8 Wrapperklassene Integer, Double, m.fl. 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); } •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) Utskrift: Kan ikke omforme 234_567 til tall java.lang.NumberFormatException: 234_567 Gjør oppgave 1 side 269.

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 9 Metodene equals() og toString() •Alle klasser er subklasser til klassen java.lang.Object •Alle klasser arver de metodene som er deklarert i klassen Object, bl.a.: –public String toString() •returnerer navnet på klassen som objektet tilhører etterfulgt og en tallkode –public boolean equals(Object obj) •sammenligner referansen this med referansen obj, true hvis disse er like •Men - en klasse kan (og bør!) lage sine egne utgaver av disse metodene. Da er det disse som gjelder for objekter av klassen. •Metodene bør programmeres slik: –toString() bør returnere en tekst som klienten kan bruke til å skrive ut innholdet i objektet –equals() bør sammenligne innholdet i objektene •Metoden toString() er underforstått dersom vi knytter et objekt til en tekst med +, eks. System.out.println(”Kontoen: ” + konto1); Gjør oppgaven side 270.

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 10 Sammenhenger mellom objekter - assosiasjoner •En assosiasjon mellom klasser betyr at det eksisterer en forbindelse mellom objekter av klassene. Eksempler: LeilighetFlate 6..* 1..1 består av multiplisitet navn med leseretning Person Kontor 1 1 bor på Bok Forfatter 1..* er skrevet av

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 11 Oppussingseksemplet enda en gang, brukergrensesnittet Inndata om flate: navn, lengde, bredde, malingstype. Inndata om malingstype: navn, antall strøk, ant. kvm/l, pris pr liter Registrerer to flater med hver sine malinger: Har skiftet maling på taket i gangen:

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 12 Oppussingseksemplet 1 Vi skiller mellom klasser som beskriver brukergrensesnittet, og klasser som tilhører det problemet vi skal løse. Dette gjør det enkelt å bytte ut brukergrensesnittet senere. Klasser som tilhører problemet: Oppussingsprosjekt finnNavn() registrerNyFlate( nyFlate: Flate) finnFlate(navn: String) finnAntFlater() finnFlate(indeks: int) registrerNyMaling( nyMaling: Maling) finnMaling(navn: String) finnAntMalinger() finnMaling(indeks: int) finnTotalpris() Flate finnNavn() finnLengde() finnBredde() finnMaling() settMaling( nyMaling: Maling) finnAreal() finnOmkrets() navn: String lengde: double bredde: double *1 Maling navn: String pris: double antStrøk: int antKvmPrLiter: double finnNavn() finnPrisPrLiter() finnAntStrøk() finnAntKvmPrLiter() finnAntLiter( Flate enFlate) finnTotalpris ( Flate enFlate) * 1 trenger består av navn: String 1 * bruker

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 13 Å programmere assosiasjoner •Et register framkommer som en en-til-mange-assosiasjon mellom en klasse som har ansvaret for å vedlikeholde registeret, og den klassen som beskriver de objektene som inngår i registeret. –Her vedlikeholder klassen Oppussingsprosjekt to registre, et register med Flate-objekter og et register med Maling-objekter. •Vi lager et register ved å lage en tabell-liste i register-klassen. Denne tabell-listen inneholder referanser til objektene som lagres i registeret. class Oppussingsprosjekt { private ArrayList alleFlater = new ArrayList(); private ArrayList alleMalinger = new ArrayList(); •Dersom objektet på mange-siden i en en-til-mange-assosiasjon trenger å vite om objektet på den andre siden, kan vi få til det ved å ta med en referanse til dette objektet: class Flate { private String navn; private double lengde; private double bredde; private Maling maling;

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 14 Hvilke 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.

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 15 Vis programliste 10.1 side •Oppgaver i tilknytning til denne programlisten –Anta at vi i et klientprogram har laget følgende objekt: •Oppussingsprosjekt prosjekt = new Oppussingsprosjekt(”Hus”); –Vi har registrert en del flater og en del malinger. –Sett opp deler av et klientprogram som gjør følgende: •Lager og registrerer en ny flate med maling, konstruktører: –public Flate(String startNavn, double startLengde, double startBredde) –public Maling(String startNavn, int startAntStrøk, double startAntKvmPrLiter, double startPris) •Finner ut om en maling med navn ”Huldra 8” eksisterer. •Skriver ut navnet på alle registrerte flater. •Utvid løkken foran, slik at også navnet på malingen skrives ut.

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 16 Interface •Et interface er en samling med metodehoder. •En klasse kan velge å implementere et interface. Den må da programmere alle metodene i interfacet. •Eksempel på interface: public interface Comparable { // tilhører pakken java.lang public int compareTo(Object obj); } •Eksempel på klasse som implementerer interfacet: class Flate implements Comparable {....objektvariabler.... public int compareTo(java.lang.Object obj) { // sammenligner arealene Flate denAndreFlaten = (Flate) obj; double areal1 = finnAreal(); // arealet til this double areal2 = denAndreFlaten.finnAreal(); if (areal1 < areal ) return -1; else if (areal1 > areal ) return 1; else return 0; }.....andre metoder i klassen.... } Gjør oppgaven side 286.

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 17 Hvordan er det mulig å lage generelle sorterings- og søkemetoder for tabeller av objekter? •En slik metode vil ha behov for å sammenligne objekter. •Ulike typer objekter sammenlignes på forskjellige måter. •Vi bør kunne sammenligne et objekt med et annet av samme klasse ved å sende en melding til det første objektet, eksempel: navn1.compareTo(navn2) •Klassen som objektene tilhører må inneholde en slik sammenligningsmetode. •Det er mulig å lage en generell sorterings- eller søke-metode dersom navnet på sammenligningsmetoden er det samme for alle typer objekter. •Det kan vi sikre ved å lage et interface som inneholder metodehodet, og så kreve at objekter som skal sorteres tilhører klasser som implementerer dette interfacet. •Comparable er et slikt interface: public interface Comparable { // tilhører pakken java.lang public int compareTo(Object obj); }

18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 18 Ferdige sorterings- og søkemetoder, med Comparable •Disse metodene krever at objektene tilhører klasser som implementerer interfacet Comparable. •Klassen java.util.Arrays for tabeller: –static int binarySearch(Object[] tabell, Object[] søkeverdi) –static void sort(Object[] tabell) –static void sort(Object[] tabell, int fraIndeks, int tilIndeks) •Kan kaste unntak: ArrayIndexOutOfBoundsException, IllegalArgumentException, ClassCastException •Klassen java.util.Collections for tabell-lister: –static int binarySearch(List tabellListe, Object søkeverdi) –static void sort(List tabellListe) •Klassen ArrayList implementerer et interface som heter List, derfor er første parameter av typen List.

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 19 Et alternativ til Comparable •Vi kan lage et objekt som inneholder alle opplysningene om sorteringen av (de andre) objektene. •Et slikt objekt må tilhøre en klasse som implementerer interfacet Comparator: public interface Comparator { // tilhører pakken java.util public int compare(Object o1,Object o2) public boolean equals(Object obj) } •Klassen java.text.Collator er et nyttig eksempel –Et objekt av denne klassen inneholder sorteringsrekkefølgen for strenger i henhold til en gitt lokasjon. •public static Collator getInstance() •public static Collator getInstance(Locale ønsketLokasjon) •public int compare(String tekst1, String tekst2) •public void setStrength(int nyStyrke) // PRIMARY, SECONDARY, TERTIARY

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 20 Sortering av tekster i hht norsk tegnsett public static void sorterTekstLocale(String[] tabell) { Collator kollator = Collator.getInstance(); for (int start = 0; start < tabell.length; start++) { int hittilMinst = start; for (int i = start + 1; i < tabell.length; i++) { if (kollator.compare(tabell[i], tabell[hittilMinst]) < 0) hittilMinst = i; } String hjelp = tabell[hittilMinst]; tabell[hittilMinst] = tabell[start]; tabell[start] = hjelp; } public static void sorterHeltallstabell(int[] tabell) { for (int start = 0; start < tabell.length; start++) { int hittilMinst = start; for (int i = start + 1; i < tabell.length; i++) { if (tabell[i] < tabell[hittilMinst]) hittilMinst = i; } int hjelp = tabell[hittilMinst]; tabell[hittilMinst] = tabell[start]; tabell[start] = hjelp; } Sortering av heltall, side 241. Sortering av tekster, side 287.

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 10, side 21 Ferdige sorterings- og søkemetoder, med Comparator •Disse metodene bruker en ”Comparator” til å sammenligne objektene. •Klassen java.util.Arrays for tabeller: –static int binarySearch(Object[] tabell, Object[] søkeverdi, Comparator comp) –static void sort(Object[] tabell, Comparator comp) –static void sort(Object[] tabell, int fraIndeks, int tilIndeks, Comparator comp) •Kan kaste unntak: ArrayIndexOutOfBoundsException, IllegalArgumentException, ClassCastException •Klassen java.util.Collections for tabell-lister: –static int binarySearch(List tabellListe, Object søkeverdi, Comparator comp) –static void sort(List tabellListe, Comparator comp) •Klassen ArrayList implementerer et interface som heter List, derfor er første parameter av typen List. Gjør alle oppgavene side


Laste ned ppt "Programmering i Java versjon 2001-05-16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."

Liknende presentasjoner


Annonser fra Google