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
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
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
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
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
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
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:
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]
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
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
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. */}
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.
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
........
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()
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.
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.
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/
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
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.
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?
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.
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]
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]; } }}
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
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];}
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.
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)
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
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.
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