29
versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003. Kapittel 7 Programmering i Java http://www.tisip.no/Javabok/ Tabeller Datastrukturen tabell side 2-4 Å kopiere en tabell side 5-7 Klassen Maned side 8 Sortering side 9-11 Tabell som argument side 12 Søking side 13-14 Klassen java.util.Arrays side 15 Bruk av online API-dok. side 16-18 Todimensjonale tabeller side 19-20 Mer enn to dimensjoner side 21-22 En tabell av referanser, eksempel strenger side 23-25 Tabell av referansetype som medlem i en klasse side 26 Sortering av objekter side 27-29

Tabeller

  • Upload
    stew

  • View
    53

  • Download
    0

Embed Size (px)

DESCRIPTION

Tabeller. Datastrukturen tabellside 2-4 Å kopiere en tabellside 5-7 Klassen Manedside 8 Sorteringside 9-11 Tabell som argumentside 12 Søkingside 13-14 Klassen java.util.Arraysside 15 Bruk av online API-dok.side 16-18 Todimensjonale tabellerside 19-20 - PowerPoint PPT Presentation

Citation preview

Page 1: Tabeller

versjon desember 2002Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal,

Stiftelsen TISIP og Gyldendal Akademisk 2003.Kapittel 7

Programmering i Javahttp://www.tisip.no/Javabok/

Tabeller

Datastrukturen tabell side 2-4Å kopiere en tabell side 5-7Klassen Maned side 8Sortering side 9-11Tabell som argument side 12Søking side 13-14Klassen java.util.Arrays side 15Bruk av online API-dok. side 16-18Todimensjonale tabeller side 19-20Mer enn to dimensjoner side 21-22En tabell av referanser, eksempel strenger side 23-25Tabell av referansetype som medlem i en klasse side 26Sortering av objekter side 27-29

Page 2: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 2

Behov for datastrukturen tabell

• En datastruktur er en samling data lagret i primærminnet under ett navn.

• Et objekt er en datastruktur.• En tabell er en datastruktur som

kan brukes dersom alle dataene tilhører samme datatype.

• Eksempel: Nedbøren som faller hver dag i en måned.

• Hvordan deklarere objektvariablene?

private String mndNavn;private int nedbør1;private int nedbør2;private int nedbør3;private int nedbør4; .....private int nedbør31;

Maned

mndNavn: Stringnedbør[28..31]: int

finnMaksimumfinnAntTørreDagerfinnGjSnitt

Page 3: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 3

Datastrukturen tabell

• Vi deklarerer en tabell: – int[] mars = new int[31];

int[ ] mars = new int[31];

10 10 20 5

mars

0 0 1 0

[0] [1] [2] [3] ............. [27] [28] [29] [30]

indeks

lengde

Page 4: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 4

Å bruke en tabell

• Vi kan få tak i hvert enkelt element ved indeksering:– mars[0] = 20;

– mars[15] = 30;

– int sum = mars[0] + mars[1] + mars[2];

• Tabellens lengde er gitt av uttrykket mars.length.

• Første element har alltid indeks 0, siste element indeks (length-1).

• Bruk av ugyldig indeks kaster unntaket ArrayIndexOutOfBoundsException.

• Dersom vi er usikre, må vi bruke en if-setning der vi kontrollerer indeksen før vi bruker den:

– if (indeks >= 0 && indeks < mars.length) tall = mars[indeks];

• Summerer all nedbør i mars:int sumMars = 0;

for (int i = 0; i < mars.length; i++) sumMars += mars[i];

• Vi kan initiere en tabell samtidig med deklarasjonen:– int[] enUke = {4, 5, 6, 7, 1, 2, 3}; // lengden blir 7

• Dersom en tabell ikke initieres på denne måten, får alle elementene verdien 0.Gjør alle oppgavene side 203

Page 5: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 5

Å kopiere en tabell

• Hva med å bruke tilordningstegnet?

• Fungerer ikke…vi får to referanser til samme tabell.

int[] tab1 = {1, 4, 6, -2};int[] tab2 = {7, 14, -6, 0};

1 4 6 -2

7 14 -6 0

tab1

tab2

Etter setningen:tab2 = tab1;

1 4 6 -2

7 14 -6 0

tab1

tab2

Page 6: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 6

Må kopiere en tabell element for element

Gjør oppgave 1 side 204-205.

int[] tab1 = {1, 4, 6, -2};int[] tab2 = {7, 14, -6, 0};

1 4 6 -2

7 14 -6 0

tab1

tab2

7 14 -6 0

7 14 -6 0

tab1

tab2

Kopierer element for element:

for (int i = 0; i < tab1.length; i++) { tab1[i] = tab2[i];}

Før kopiering:

Etter kopiering:

Page 7: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 7

Vi kan bruke System.arraycopy() til å kopiere tabeller

int[] tab1 = {1, 4, 6, -2};int[] tab2 = {7, 14, -6, 0};

1 4 6 -2

7 14 -6 0

tab1

tab2

Etter setningen:System.arraycopy(tab1, 1, tab2, 2, 2);

1 4 6 -2

7 14 4 6

tab1

tab2

[0] [1] [2] [3]

[0] [1] [2] [3]

Page 8: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 8

Klassen Maned

Vis programliste 7.2 side 206-208

Gjør oppgave 1 og 2 side 209.

Maned

mndNavn: Stringnedbør[28..31]: int

finnMaksimumfinnMinimumfinnGjSnitt

Page 9: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 9

Sortering ved utvelgelse

for (start = 0; start < tabell.length; start++) { finn indeksen til minste element i området mellom indeksene start og tabell.length - 1 bytt om minste element med elementet på plass start}

3 4 -5 13 10 0 8 -2

-5 4 3 13 10 0 8 -2

-5 -2 3 13 10 0 8 4

-5 -2 0 13 10 3 8 4

-5 -2 0 3 10 13 8 4

-5 -2 0 3 4 13 8 10

-5 -2 0 3 4 8 13 10

-5 -2 0 3 4 8 10 13

før start

etter første runde

ferdig

Eksempler:• rangering av deltakerne i en

konkurranse• sortering av navn til en

telefonliste• ordning av kommuner etter

prisen på kommunale tjenester

Page 10: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 10

Metoden sorterHeltallstabell - en klassemetode

/* * Sorter.java E.L. 1999-09-15 * */package mittBibliotek;public class Sorter { 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; } } /* En annen sorteringsmetode ligger også i denne klassen. Se kapittel 9. */}

Page 11: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 11

Eksempel på bruk av metoden Sorter()

import mittBibliotek.*;class TestSorter { public static void main(String[] args) { int[] test = {3, 4, -5, 13, 10, 0, 8, -2, 22, 15, 11, 9, 17}; Sorter.sorterHeltallstabell(test); // klassenavnet foran metode-navnet System.out.println("Sortert tabell: "); for (int i = 0; i < test.length; i++) System.out.print(test[i] + " "); System.out.println(); }}

Hvis vi ønsker å sortere desimaltall, må vi lage en egen metode for denne datatypen.

Sortering av objekter (for eksempel strenger) krever spesiell omtanke, se senere.

Page 12: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 12

Tabell som argument

• Tabellnavnet er en referanse.

• En tabell som argument betyr at vi sender over en referanse til tabellen, og metoden jobber med de samme tabellelementene som klienten:

Gjør oppgave 3 side 212.

3 4 -5 13

testklient

tabellsorterHeltallstabell

Metodekall:Sorter.sorterHeltallstabell(test);

Ved kallet skjer følgende bak kulissene:int[] tabellsorterHeltallstabell = testklient

........

Page 13: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 13

Søking

• Å søke i en tabell betyr å finne det eller de elementene som tilfredsstiller bestemte kriterier.

• Eksempel: Vi oppgir en verdi og finner indeksen til ett eller alle elementene som er lik denne verdien.

• Må ta hensyn til at det vi leter etter, kanskje ikke finnes i det hele tatt.

• Eksempler på søk i programliste 7.2:– finnAntTørreDager()

– finnDgMaks()

Page 14: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 14

Å programmere søk etter en bestemt verdi

• Finner indeksen til en dag med en bestemt nedbørmengde:public int finnDag(int verdi) {

for (int i = 0; i < nedbør.length; i++) {

if (nedbør[i] == verdi) return i; // verdi funnet

}

return -1; // verdi ikke funnet

}

• Dersom vi ikke skal returnere verdien: int dagNr = 0;

while (dagNr < nedbør.length && nedbør[dagNr] != verdi) dagNr++;

if (dagNr < nedbør.length) {

...gjør det som skal gjøres hvis verdien er funnet...

} else {

...gjør det som skal gjøres hvis verdien ikke er funnet...

}

Kontrollerer indeksen før den brukes!(utnytter at Java bruker

teknikken ”forkortet beregning”ved utregning av logiske uttrykk)

Gjør oppgave 1 side 213-214.

Page 15: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 15

Klassen java.util.Arrays

• Tilbyr klassemetoder for å håndtere tabeller

• I metodehodene nedenfor er datatype en primitiv datatype

• Sortering– static void sort(datatype[] tab)

– static void sort(datatype[] tab, int fraIndeks, int tilIndeks)

• Søking, forutsetter at tabellen er sortert på forhånd– static int binarySearch(datatype[] tab, datatype søkeverdi)

Vis programliste 7.4 side 214-215.

Page 16: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 16

Bruk av online API-dokumentasjonen …skal finne flere metoder i klassen java.util.Arrays….

klikk!

jdk1.4/docs/

Page 17: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 17

...online dokumentasjonen, forts…

oversikt over klassene

oversikt over pakkene

Page 18: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 18

…og her fant vi klassen Arrays…

Gjør oppgave 1 side 218.

Page 19: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 19

Behov for en todimensjonal tabell

• Salgsdata for hver dag i et år (52 uker, 5 dager pr uke) kan framstilles på følgende måte:

dag 0 dag 1 dag 2 dag 3 dag 4uke 0 100 200 150 210 300

uke 1 230 200 160 300 450

uke 2 120 210 180 400

uke 3

uke 4

uke 5

......

uke 51Oppgave: Hvilke tjenester bør et objekt sominneholder denne informasjonen, tilby sine klienter?

Page 20: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 20

En todimensjonal tabell

• En todimensjonal tabell har linjer og kolonner.• Hver linje er å betrakte som en endimensjonal tabell med følgende navn: salg[0], salg[1],

salg[2], salg[3].• Eksempler:

– salg[1][3] = 400;– int salget = salg[0][4];– int sum = salg[3][0] + salg[3][1]; Vis programliste 7.5 side 219-223.

100 200 150 210230 200 160 300120 210 180 400

300450120

300 310 250 240 200

salg[0]

salg[1]

salg[2]

salg[3]

0 1 2 3 4salg[1][3]

salg[3][4]

int[ ][ ] salg = new int[4][5]; // 4 uker, 5 dager pr. uke

Gjør oppgave 1 og 2 side 225.

Page 21: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 21

Mer enn to dimensjoner

• Skal registrere salgsdata pr selger:

200 200 450 200180 200 160 300210 210 180 400

600450120

310 310 250 240 200

0

1

2

3

0 1 2 3 4

320 450 240 220140 200 160 300150 210 180 400

760450120

110 310 250 240 200

100 200 150 210230 200 160 300120 210 180 400

300450120

300 310 250 240 200

dag nr

uke nr

selger nr 0selger nr 1

selger nr 2

int[][][] salg = new int[3][4][5]

antSelgere antUker antDager

salg[2][2][4]

salg[0][0][0]

Page 22: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 22

Behandling av den tre-dimensjonale tabellen salg• Hvor mye har selgeren med indeks selgernr solgt for i uken med indeks ukenr?

int sum = 0;for (int i = 0; i < salg[selgernr][ukenr].length; i++) { sum += salg[selgernr][ukenr][i];}

• Hvor mye har selgeren med indeks selgernr solgt for totalt?int sum = 0;for (int ukenr = 0; ukenr < salg[selgernr].length; ukenr++) { for (int dagnr = 0; dagnr < salg[selgernr][ukenr].length; dagnr++) { sum += salg[selgernr][ukenr][dagnr]; }}

• Hva er totalsalget?int sum = 0;for (int selgernr = 0; selgernr < salg.length; selgernr++) { for (int ukenr = 0; ukenr < salg[selgernr].length; ukenr++) { for (int dagnr = 0; dagnr < salg[selgernr][ukenr].length; dagnr++) { sum += salg[selgernr][ukenr][dagnr]; } }}

Page 23: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 23

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] = = JOptionPane.showInputDialog("Skriv et navn: ");• navneliste[3] = navneliste[0].toUpperCase();

– Kan også skrive:• String[] navneliste = {”Anne”, ”Berit”, ”Åge”, ”ANNE”};

navneliste

Anne

Berit

Åge

AN

NE

Page 24: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 24

Å kopiere en tabell av referanser fører ikke til at objektene kopieres

navneliste

Anne

Berit

Åge

AN

NE

navnelisteKopi

String[] navnelisteKopi = new String[4];for (int i = 0; i < navneliste.length; i++) { navnelisteKopi[i] = navneliste[i];}

Page 25: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 25

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-3 side 233.

Page 26: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 26

Tabell av referansetype som medlem i klasse

Gjennomgå programliste 7.9, side 235-238,se spesielt metoden sorterFag() (neste side)

Page 27: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 27

Sortering av objekter

public void sorterFag() {

for (int start = 0; start < antFag; start++) {

int hittilMinst = start;

for (int i = start + 1; i < antFag; i++) {

String denneFagkode = fagene[i].finnFagkode();

String hittilMinstFagkode = fagene[hittilMinst].finnFagkode();

if (denneFagkode.compareToIgnoreCase(hittilMinstFagkode) < 0) hittilMinst = i;

}

Fag hjelp = fagene[hittilMinst];

fagene[hittilMinst] = fagene[start];

fagene[start] = hjelp;

}

}

class Fag { private String fagkode; // entydig private String fagnavn; private int antSp;

class Fagkatalog { private Fag[] fagene; private int antFag;

Sorterer fag-objekteneetter fagkode.

bytter om innholdet i referansene,objektene ligger i ro

Page 28: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 28

Bytter om innholdet i to referanser

fagene

LV172D

LV195D

LV191D

LV193D

Trinn 1:hjelp = fagene[hittilMinst]

1

start

hjelp

fagene

Trinn 2:fagene[hittilMinst] = fagene[start]

hjelp

2

hittilMinst

LV172D

LV195D

LV191D

LV193D

fagene

hjelp

LV172D

LV193D

Trinn 3:fagene[start] = hjelp

LV191D

LV195D

Vi bytter om rekkefølgen på referansene. Objektene ligger i ro. At sirklene er tegnet under hverandre betyr ikke at de ligger etter hverandre i primærminnet.

Page 29: Tabeller

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2003.

Kapittel 7, side 29

Flerdimensjonale tabeller er lite brukt i objektorientert programmering

• Vi trenger å bruke flerdimensjonale tabeller dersom vi skal behandle dataene i flere dimensjoner.• Ellers lager vi heller tabeller av objekter, der hvert objekt inneholder en tabell med tilleggsinformasjon knyttet direkte til tabellen.

januar

februar

mars

desember

1995

januar

februar

mars

desember

1996

januar

februar

mars

desember

1997

statistikk