Indhold:
Erklæring og brug af arrays.
Arrays med startværdier.
Arrays af objekter.
Arrays sammenlignet med lister.
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. Hidtil har vi gjort det med ArrayList, 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 ArrayList.
Ligesom med ArrayList 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 bliver altid initialiseret med 0 som standardværdi1. 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[] arg) { 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 lig med arrayets længde-1. Indekserer man uden for arrayets grænser, kastes 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.
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[] arg) { 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
Arrays kan initialiseres med startværdier i {} og er adskilt med komma. Eksempel:
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[] arg) { 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,
Metoden main(), som vi har defineret utallige gange, har en parameter, som er et array af strenge. Dette array indeholder kommandolinie-argumenter ved kørsel af programmet.
public class Kommandolinie { public static void main(String[] arg) { System.out.println("Antallet af argumenter er: " + arg.length); for (int i=0; i< arg.length; i=i+1) System.out.println("Argument "+i+" er: " + arg[i]); } }
Antallet af argumenter er: 3 Argument 0 er: x Argument 1 er: y Argument 2 er: z
Programmet herover er kørt fra kommandolinien med "java Kommandolinie x y z".
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[] arg) { // 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[] arg) { 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 10. måned er " + måneder[9] ); } }
Den 1. måned er januar Den 6. måned er juni Den 10. 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 elementer 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[] arg)
{
Terning[] t={new Terning(), new FalskTerning2(), new FalskTerning2()};
for (int i=0; i<t.length; i++) t[i].kast();
}
}
Som det ses, er det umuligt at ændre størrelsen på et array, så det er besværligt f.eks. at indsætte eller slette 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 ArrayList-klassen et array i en indpakning, der gør det nemmere at bruge. Hvad du vælger er op til dig selv.
En liste 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.
Lav et program, der simulerer kast med 6 terninger. Der udføres f.eks. 100 kast. Optæl i et array hyppigheden af summen af øjenantallene.
Udvid programmet til at kunne lave statistik på kast med et vilkårligt antal terninger.
Ændr programmet, så man kan angive antallet af terninger på kommandolinien.
1For et array af boolean vil de have værdien false (j.v.f. afsnit 2.11.2, De simple typer). Havde arrayet indeholdt (referencer til) objekter, var de blevet sat til null.