6108 Programmering i Java Leksjon 5 Tabeller Roy M. Istad 2015
Hva er tabeller? Tabell (evt. array): Sammensetning av verdier i den samme datatypen, under ett navn i hurtigminnet. Gir rask og effektiv håndtering av data. Verdiene i en tabell adresseres ved posisjon (indeks). 1) Eksempel: 2) Timeplan 6108 Programmering i Java Leksjon 5 side 2
Andre datatabeller Datatabeller fra regneark eller databaser tillater blanding av datatyper, f.eks: I Java må akkurat disse dataene håndteres i minst tre tabeller: En egen tabell i String, en i double og en i int Hvis Nr er et vilkårlig varenummer, trengs enda en int tabell 6108 Programmering i Java Leksjon 5 side 3
Tabelldimensjon og indekser Dimensjonen til en tabell er gitt ved antall indekser (vanligvis én) flere indekser/flerdimensjonale tabeller kommer i senere emner. Indeksene er heltall, og blir automatisk satt med 0 som den minste. (String) Vår indeksering: Ukedag 0 1 2 3 4 5 6 Denne tabellen har altså dimensjon 1 Javas indeksering (heltall) 6108 Programmering i Java Leksjon 5 side 4
Deklarasjon og oppretting int[] timetab; Referansevariabel Merkelapp, navngitt referanse. Kan peke på en tabell, men det er ingen tabell der ennå... Alternativ: Deklarasjon og oppretting samtidig (initiering) int[] timetab = {8, 12, 10, 7, 7, 4, 0}; // Verdiliste 7 verdier samlet i én enhet Indeksert variabel: timetab[2] Automatisk indeksert 0 6 6108 Programmering i Java Leksjon 5 side 5
Tabelldeklarasjon generelt datatype[] tabellnavn = new datatype[lengde]; Siste komponent har indeks lengde-1 fordi tellingen starter på 0. int[] heltallstabell = new int[5]; OBS! Automatisk nullstilling Ved oppretting (new) av tabell blir alle element i tabellen tildelt standardverdi. Dersom tabellen inneholder heltall: 0 desimaltall: 0.0 boolske verdier: false enkelttegn: NUL (tegn nr 0) objekt: null 6108 Programmering i Java Leksjon 5 side 6
Avlesing av verdi, og utskrift av tabeller int[] timetab = {8, 12, 10, 7, 7, 4, 0}; int sum = 0; for(int i=0; i<7; i++) sum += timetab[i]; out.print("sum timer: " + sum); 1) Fungerer ikke (kompilering ok, men info ): Konsollet out.println("tabellen: " + timetab); 2) Vanlig utskrift via indeksert variabel: for (int i=0; i<7; i ++) out.println("dag " + i + ": "+ timetab[i]); 6108 Programmering i Java Leksjon 5 side 7
Inndata til tabeller Eksempel: Telling av øyne (1 6) ved terningkast Leser inn ett og ett kastresultat fra brukeren vha. en hjelpemetode: int[] antall = new int[7]; int kast = lesheltall(); while (kast!= 0) { antall[kast]++; kast = lesheltall(); } NB! Koden forutsetter at brukeren skriver en lovlig terningverdi, eller 0 for å avslutte tellingen. Kommer det et negativt tall, eller ett som er større enn 6, vil programmet bli avsluttet med feilmeldingen: ArrayIndexOutOfBounds 6108 Programmering i Java Leksjon 5 side 8
Telletabell for terningkast Figur s. 178 int[] antall = new int[7]; int kast = lesheltall(); while (kast!= 0) { antall[kast]++; kast = lesheltall(); } Obs! Alternativt kunne tabellen vært deklarert slik: int[] antall = new int[6]; Da ville oppdateringene blitt: antall[kast-1]++; fordi indekseringen er 0 5 6108 Programmering i Java Leksjon 5 side 9
Eksempel: Sekvensielt søk Gjenfinne verdier i en tabell boolean funnet=false; int i=0; while (!funnet && i<tall.length ) if ( tall[i] == leteretter ) funnet = true; else i++; // Flytt til neste tall NB! Avleser antall element i tabellen. Merk at length er en (instans )variabel, ikke en metode. 6108 Programmering i Java Leksjon 5 side 10
Tabellkopiering 1 : tabellb = tabella; : «Kopi»: Referanseoverføring, ikke ny tabell! 6108 Programmering i Java Leksjon 5 side 11
Tabellkopiering 2 Ønsker å kopiere innholdet i tabellen, dvs. få en annen like stor tabell med eksakt samme innhold komponent for komponent. int[] tabellb = new int[tabella.length]; for (int i=0; i<tabella.length; i++) tabellb[i] = tabella[i]; = i = i = i = i // NB! Komponentvis kopiering 6108 Programmering i Java Leksjon 5 side 12
Likhet mellom tabeller Sjekker referanselikhet, ikke innholdslikhet: if ( tabella == tabelld ) // false Referanselikhet: Pekes det på én og samme tabell? tabella.length == tabelld.length Verdilikhet (innholdslikhet): == == == == To tabeller sies å være verdilike dersom de er like store og inneholder eksakt samme verdier i samme rekkefølge. if ( Arrays.equals(tabellA, tabelld) ) // true 6108 Programmering i Java Leksjon 5 side 13
Like tabeller? false tabella == tabellb Arrays.equals(tabellA, tabellb) true 6108 Programmering i Java Leksjon 5 side 14
Læreboka side 194 NB! Arrays klassen importeres ved: import java.util.*; Arrays klassen importeres altså ikke statisk (static) for å unngå navnekollisjoner som ved min/max metodene i Integer og Math! Metoder fra Arrays klassen må da kalles ved klasse som fornavn: Arrays.equals Arrays.sort Arrays.binarySearch Arrays.copyOf 6108 Programmering i Java Leksjon 5 side 15
Gjenfinne verdier i en tabell boolean funnet=false; int i=0; while (!funnet && i<tall.length ) if ( tall[i] == leteretter ) funnet = true; else i++; // Flytt til neste tall Jfr. eks. 5.1, side 180, og lysark nr 10 Alternativ nå via Arrays klassen: Arrays.sort(tall); // NB! Sortering før søk int i = Arrays.binarySearch(tall, leteretter); boolean funnet = (i>=0); // i holder indeks til tallet 6108 Programmering i Java Leksjon 5 side 16
Sortering av en tabell Figur s. 184 int[] tall = {7, 2, 1, 4}; int lengde = tall.length; int[] nyetall = new int[lengde]; for (int tallnr=0; tallnr<lengde; tallnr++) { int minpos = 0; // Minimum på 0-plassen? for (int posnr=1; posnr<lengde; posnr++) if ( tall[posnr] < tall[minpos] ) minpos = posnr; // Nå er minste verdi på plass nr minpos nyetall[tallnr] = tall[minpos]; // Sletter minimumsverdien tall[minpos] = Integer.MAX_VALUE; } tall = nyetall; // tall-tabellen er sortert Arrays.sort(tall); // Alternativt 6108 Programmering i Java Leksjon 5 side 17
Tabell som returverdi fra en metode private public static int[] dobling(int[] tab) { int[] nytab = new int[tab.length]; for (int i=0; i<tab.length; i++) nytab[i] = 2*tab[i]; return nytab; } Eksempel på metode kall: : // tabella har fått verdier : int[] tabellb; tabellb = dobling(tabella); : 6108 Programmering i Java Leksjon 5 side 18
Metoder: Referanseoverføring av tabeller Java bruker referanseoverføring (call by reference) til parameter overføring av tabeller. Det er altså kun referansen (pekeren) til tabellen som overføres og metoden "jobber på" den aktuelle parameteren (faktiske tabellen). private static void nullstill(int[] tab) { for (int i=0; i<tab.length; i++) tab[i] = 0; } Eksempel på metode kall: : nullstill(mintabell); // void-metode, egen programsetning // Etter kallet: Alle element i mintabell har verdien 0 : 6108 Programmering i Java Leksjon 5 side 19
6108 Programmering i Java Slutt på leksjon 5