Indhold:
Erklæring og brug af arrays.
Arrays med startværdier.
Arrays af objekter.
Arrays sammenlignet med vektorer
Kapitlet forudsættes ikke i resten af bogen, men er nyttigt i praktisk programmering.
Forudsætter kapitel 3, Objekter (og et enkelt sted kapitel 5, Nedarvning).
Ofte har man behov for at håndtere et større antal objekter eller simple typer på en ensartet måde. Indtil nu har vi gjort det med lister af typen Vector, men Java understøtter også arrays.
Et array er en række data af samme type
Man kan f.eks. have et array af int eller et array af Point. Når man har et array af int, betyder det, at man har en række int-variabler som ligger i arrayet og kan ændres eller læses vha. arrayet og et indeks. Indekset er nummeret på variablen i arrayet - ligesom i Vector.
Ligesom med Vector skal man skelne mellem array-variablen og array-objektet. Array-variablen refererer til array-objektet, som indeholder variablerne.
Man erklærer en array-variabel med den type data, man ønsker at lave et array af, umiddelbart efterfulgt af "[]", f.eks.:
int[] arr;
Dette erklærer, at arr er en variabel med typen "array af int". Ligesom med variabler af objekt-type er dette blot en reference hen til det egentlige array-objekt. Hvis man ønsker at oprette et array, skriver man f.eks.:
arr = new int[6];
Dette sætter arr til at referere til et array, der har 6 elementer.
Elementer i et array har som udgangspunkt værdien 0. Havde arrayet indeholdt referencer til objekter, var de blevet sat til null.
Arrayets værdier kan sættes og aflæses ved at angive indeks i firkantede []-parenteser efter variabelnavnet:
public class ArrayEksempel1 { public static void main(String[] args) { int[] arr = new int[6]; arr[0] = 28; arr[2] = 13; arr[3] = arr[0] + arr[1] + arr[2]; int længde = arr.length; // = 6, da vi oprettede det med new int[6] for (int i=0; i<længde; i=i+1) System.out.print( arr[i] + " " ); System.out.println(); } }
28 0 13 41 0 0
Indekseringen starter altid fra 0 af, og sidste lovlige indeks er dermed lig med arrayets længde-1. Indekserer man uden for arrayets grænser, kastes undtagelsen ArrayIndexOutOfBoundsException.
Alle arrays er objekter (derfor bruges new-operatoren, når vi opretter et nyt array). Alle array-objekter har variablen length, som fortæller hvor mange pladser arrayet indeholder.
Længden på et array kan ikke ændres
Selvom array-objekter ikke kan ændre længde, kan man lade variablen referere til et andet array-objekt med en anden længde:
arr = new int[8];
Nu refererer arr til et andet array med længde 8 (og det gamle arrays og dets værdier er glemt).
Arrays er gode til at lave statistik med. Her laver vi statistik på slag med to terninger:
import java.util.*; public class TerningStatistik { public static void main(String[] args) { int[] antal = new int[13]; // array med element nr. 0 til og med 12 for (int i=0; i<100; i=i+1) { int sum = (int) (6*Math.random()+1) + (int) (6*Math.random()+1); antal[sum] = antal[sum]+1; // optæl statistikken for summen af øjne } for (int n=2; n<=12; n=n+1) System.out.println( n + ": " + antal[n]); } }
2: 2 3: 9 4: 7 5: 17 6: 14 7: 15 8: 8 9: 9 10: 8 11: 7 12: 4
Main-metoden, som vi har defineret utallige gange, tager en parameter, som er et array af strenge. Dette array indeholder kommandolinie-parametrene ved kørsel af programmet.
public class Kommandolinie { public static void main(String[] args) { System.out.println("Antallet af parametre er: " + args.length); for (int i=0; i< args.length; i=i+1) System.out.println("Parameter "+i+" er: " + args[i]); } }
Antallet af parametre er: 3 Parameter 0 er: x Parameter 1 er: y Parameter 2 er: z
Programmet herover er kørt fra prompten med "java Kommandolinie x y z".
Arrays kan initialiseres med startværdier i {} og er adskilt med komma.
int[] arr = {28, 0, 13, 41, 0, 0};
Det er ofte meget mere bekvemt end at sætte de enkelte værdier.
Herunder et program, der udskriver antallet af dage i hver måned:
public class Maaneder { public static void main(String[] args) { int[] måneder = {31,28,31,30,31,30,31,31,30,31,30,31}; System.out.println("Længden af januar er: " + måneder[0]); System.out.println("Længden af april er: " + måneder[3]); for (int i=0; i <måneder.length; i++) System.out.print(måneder[i] + ", "); System.out.println(); } }
Længden af januar er: 31 Længden af april er: 30 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
Et array er faktisk et objekt, men det har ingen metoder og kun én variabel, nemlig length. Arrays kan ikke ændre størrelse, og length er da også konstant. Den eneste måde at få et array af en anden størrelse er at oprette et andet array og så kopiere det gamle indhold over i det nye array.
Herunder ses, hvordan man kan fjerne et element fra et array.
public class FjernEtElement { public static void main(String args[]) { // Oprettelse og initialisering af array int[] a=new int[10]; for (int n=0;n<a.length;n=n+1) a[n]=n*10; // Gennemløb og udskrivning af array System.out.print("a før: "); for (int n=0;n<a.length;n=n+1) System.out.print(a[n]+" "); System.out.println(); // Kopiering af array / udtagning af element int fjernes=5; // Element nr 5 skal fjernes. int[] tmp=new int[9]; // Nyt array med 9 pladser // bemærk at elementet der skal fjernes ikke kopieres for (int n=0;n<fjernes;n=n+1) tmp[n]=a[n]; for (int n=fjernes+1;n<a.length;n=n+1) tmp[n-1]=a[n]; a=tmp; // Nu refererer a til det nye array med 9 elementer System.out.print("a efter: "); for (int n=0;n<a.length;n=n+1) System.out.print(a[n]+" "); System.out.println(); } }
a før: 0 10 20 30 40 50 60 70 80 90 a efter: 0 10 20 30 40 60 70 80 90
Et array af objekter oprettes på samme måde som et array af simple typer:
Point[] pkt = new Point[10];
Bemærk: Arrayet indeholder en række af referencer til objekterne. Herover oprettes altså ingen punkter! Dvs. pkt[0], pkt[1],...,pkt[9] er alle null.
Arrays kan bruges til at gå mellem værdier fra et domæne til værdier i et andet domæne. For eksempel konvertering af måneders numre (1-12) til deres navne:
public class MaanedersNavne { public static void main(String[] args) { String[] måneder = {"januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december" }; System.out.println("Den 1. måned er " + måneder[0] ); System.out.println("Den 6. måned er " + måneder[5] ); System.out.println("Den 9. måned er " + måneder[9] ); } }
Den 1. måned er januar Den 6. måned er juni Den 9. måned er oktober
På samme måde som strenge kan andre slags objekter lægges i et array, f.eks. punkter:
Point[] pkt = { new Point(100,100), new Point(110,90), new Point(10,10) };
Ligesom med almindelige variabler kan elementerne i et array godt referere til nedarvinger.
// Bruger Terning.java og FalskTerning2.java fra kapitel 4 og 5
public class Terninger
{
public static void main(String[] args)
{
Terning[] t={new Terning(), new FalskTerning2(), new FalskTerning2()};
for (int i=0; i<t.length; i++) t[i].kast();
}
}
Som det ses, er det besværligt at ændre størrelsen på et array, f.eks. når der skal indsættes eller slettes elementer. Til gengæld kan arrays indeholde simple typer, det er nemmere at få adgang til elementerne, og man kan initialisere et array på én linie. Faktisk er Vector-klassen et array i en indpakning, der gør det nemmere at bruge. Hvad du vælger er op til dig selv.
En vektor er god at bruge, når:
antallet af elementer kan ændre sig
der er brug for at indsætte og slette elementer løbende
Et array er godt at bruge, når:
antallet af elementer er fast, og man evt. kender værdierne på forhånd
man arbejder med simple typer som int og double
programmet skal være meget hurtigt
Der er desuden den fordel ved arrays, at de er typesikre. Vi kan ikke komme til at lægge værdier af forkerte typer ind i et array - så stopper oversætteren os.
Dette afsnit findes i den trykte bog
Lav et program, der simulerer kast med 2 terninger. Der udføres f.eks. 100 kast. Optæl i et array hyppigheden af summen af øjenantallene.
Lav programmet om til at lave hyppighedsstatistik på med 6 terninger. Udvid det derpå til at kunne lave statistik på kast med et vilkårligt antal terninger.
Dette afsnit findes i den trykte bog