310 likes | 567 Views
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
E N D
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 15Bruk av online API-dok. side 16-18 Todimensjonale tabeller side 19-20 Mer enn to dimensjoner side 21-22Utvidet for-løkke side 23-24En tabell av referanser, eksempel strenger side 25-27 Tabell av referansetype som medlem i en klasse side 28 Sortering av objekter side 29-31 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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; Behov for datastrukturen tabell Maned mndNavn: String nedbør[28..31]: int finnMaksimum finnAntTørreDager finnGjSnitt Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Datastrukturen tabell • Vi deklarerer en tabell: • int[] mars = new int[31]; lengde int[ ] mars = new int[31]; 10 10 20 5 0 0 1 0 [0] [1] [2] [3] ............. [27] [28] [29] [30] mars indeks Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å 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 243 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å kopiere en tabell • Hva med å bruke tilordningstegnet? • Fungerer ikke …vi får to referanser til samme tabell. tab1 tab1 1 4 6 -2 1 4 6 -2 tab2 7 14 -6 0 tab2 7 14 -6 0 int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; Etter setningen: tab2 = tab1; Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Må kopiere en tabell element for element Før kopiering: Kopierer element for element: for (int i = 0; i < tab1.length; i++) { tab1[i] = tab2[i]; } int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; Etter kopiering: tab1 1 4 6 -2 tab1 7 14 -6 0 tab2 7 14 -6 0 tab2 7 14 -6 0 Gjør oppgave 1 side 245. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Vi kan bruke System.arraycopy() til å kopiere tabeller tab1 1 4 6 -2 int[] tab1 = {1, 4, 6, -2}; int[] tab2 = {7, 14, -6, 0}; tab2 7 14 -6 0 [0] [1] [2] [3] tab1 1 4 6 -2 Etter setningen: System.arraycopy(tab1, 1, tab2, 2, 2); tab2 7 14 4 6 [0] [1] [2] [3] Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Klassen Maned Maned mndNavn: String nedbør[28..31]: int Vis programliste 7.2 side 246ff. finnMaksimum finnMinimum finnGjSnitt Gjør oppgave 1 og 2 side 249. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Sortering ved utvelgelse Eksempler: • rangering av deltakerne i en konkurranse • sortering av navn til en telefonliste • ordning av kommuner etter prisen på kommunale tjenester 3 4 -5 13 10 0 8 -2 før start etter første runde -5 4 3 13 10 0 8 -2 -5 -2 3 13 10 0 8 4 -5 -2 0 13 10 3 8 4 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 } -5 -2 0 3 10 13 8 4 -5 -2 0 3 4 13 8 10 -5 -2 0 3 4 8 13 10 ferdig -5 -2 0 3 4 8 10 13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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: testklient Metodekall: Sorter.sorterHeltallstabell(test); Ved kallet skjer følgende bak kulissene: int[] tabellsorterHeltallstabell = testklient ........ 3 4 -5 13 tabellsorterHeltallstabell Gjør oppgave 3 side 252. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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 (side 246ff.): • finnAntTørreDager() • finnDgMaks() Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å 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 254. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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 255f. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Bruk av online API-dokumentasjonen …skal finne flere metoder i klassen java.util.Arrays…. klikk! jdk1.5/docs/ Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
...online dokumentasjonen, forts… oversikt over pakkene oversikt over klassene Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
…og her fant vi klassen Arrays… Gjør oppgave 1 side 258. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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 4 uke 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 51 Oppgave: Hvilke tjenester bør et objekt som inneholder denne informasjonen, tilby sine klienter? Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
En todimensjonal tabell int[ ][ ] salg = new int[4][5]; // 4 uker, 5 dager pr. uke • 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]; salg[1][3] 0 1 2 3 4 salg[0] 100 200 150 210 300 salg[1] 230 200 160 300 450 salg[2] 120 210 180 400 120 300 310 250 240 200 salg[3] salg[3][4] Vis programliste 7.5 side 260ff. Gjør oppgave 1 og 2 side 265-266. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Mer enn to dimensjoner • Skal registrere salgsdata pr selger: dag nr salg[0][0][0] selger nr 0 0 1 2 3 4 0 selger nr 1 200 200 450 200 600 320 450 240 220 760 1 180 100 200 200 160 150 300 210 450 300 uke nr selger nr 2 140 200 160 300 450 2 210 230 210 200 180 160 400 300 120 450 150 210 180 400 120 3 310 120 310 210 250 180 240 400 200 120 110 310 250 240 200 300 310 250 240 200 salg[2][2][4] int[][][] salg = new int[3][4][5] antSelgere antDager antUker Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Utvidet for-løkke int total = 0; for (int i = 0; i < dager.length; i++) { total += dager[i]; } int total = 0; for (int dag : dager) { total += dag; } ... for hvert element dag i tabellen dager ... int total = 0; for (int dag : dager) total += dag; Utvidet for-løkke er hensiktsmessig å bruke hvis vi skal hente ut alle elementene i en tabell. Dersom vi skal gå gjennom bare en del av en tabell, eller vi trenger indeksen, er det bedre å bruke en vanlig for-løkke. Vi må også bruke vanlig for-løkke dersom vi skal forandre elementene i tabellen. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Utvidet for-løkke, forts. Todimensjonale tabeller int sum = 0; for (int uke = 0; uke < salg.length; uke++) { for (int dag = 0; dag < salg[uke].length; dag++) { sum += salg[uke][dag]; } } int sum = 0; for (int[] uke : salg) { for (int dag : uke) { sum += dag; } } Enum-typer enum Ukedag { mandag, tirsdag, onsdag, torsdag, fredag, lørdag, søndag } Ukedag[] alleDager = Ukedag.values(); for (int i = 0; i < alleDager.length; i++) { System.out.println(alleDager[i]); } Ukedag[] alleDager = Ukedag.values(); for (Ukedag dag : alleDager) System.out.println(dag); for (Ukedag dag : Ukedag.values()) System.out.println(dag); Gjør oppgavene side 275. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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 ANNE Gjennomgå programliste 7.8 side 276-277. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Å kopiere en tabell av referanser fører ikke til at objektene kopieres navneliste String[] navnelisteKopi = new String[4]; for (int i = 0; i < navneliste.length; i++) { navnelisteKopi[i] = navneliste[i]; } Anne Berit Åge ANNE navnelisteKopi Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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 278-279. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
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, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Sortering av objekter class Fag { private String fagkode; // entydig private String fagnavn; private int antSp; Sorterer fag-objektene etter fagkode. class Fagkatalog { private Fag[] fagene; private int antFag; • 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; • } • } 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, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Bytter om innholdet i to referanser Trinn 1:hjelp = fagene[hittilMinst] Trinn 2:fagene[hittilMinst] = fagene[start] Trinn 3:fagene[start] = hjelp fagene fagene fagene LV172D LV172D LV172D LV195D LV195D LV191D LV191D LV191D LV195D hjelp hjelp LV193D LV193D hjelp LV193D 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. 1 2 start hittilMinst Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.
Flerdimensjonale tabeller er lite brukt i objektorientert programmering statistikk • 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. 1995 1996 1997 januar januar januar februar februar februar mars mars mars desember desember desember Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk 2004.