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, efterfulgt af [
og ]
, 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 ArrayEksempel
{
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 en 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:
public class TerningStatistik
{
public static void main(String[] arg)
{
int[] statistik = 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);
statistik[sum]=statistik[sum]+1; // optæl statistikken for summen af øjne
}
for (int n=2; n<=12; n=n+1) System.out.println( n + ": " + statistik[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
{}
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ånedesLgd = {31,28,31,30,31,30,31,31,30,31,30,31};
System.out.println("Januar har " + månedesLgd[0] + " dage.");
System.out.println("April har " + månedesLgd[3] + " dage.");
// med foreach-løkke, se afsnit 3.6.1.
for (int lgd : månedesLgd) System.out.print(lgd + " ");
System.out.println();
}
}
Januar har 31 dage.
April har 30 dage.
31 28 31 30 31 30 31 31 30 31 30 31
Bemærk at den specielle for-each-løkke nævnt i afsnit 3.6.1 også kan bruges på arrays.
Metoden main(), som vi har defineret utallige gange, har en parameter, som er et array af strenge. Dette array indeholder kommandolinje-argumenter ved kørsel af programmet.
public class Kommandolinje
{
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 kommandolinjen med "java Kommandolinje 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 således konstant.
Den eneste måde at få et array af en anden størrelse er at oprette et andet array af den ønskede størrelse og så kopiere det gamle indhold over i det nye array, så arrays er ikke særlig rare hvis antallet af elementer varierer.
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
Eksemplet ovenfor illustrerer de basale måder at manipulere arrays på, men bemærk, at ligesom der findes en lang række standardmetoder til at arbejde med lister (beskrevet i afsnit 3.11.2), findes der metoder til at arbejde med arrays, der gør livet meget nemmere.
Se javadokumentationen for klassen Arrays (i pakken java.util) for mere information.
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 objekter. Herover oprettes altså ingen konkrete Point-objekter! Dvs. pkt[0], pkt[1],...,pkt[9] er alle null.
Arrays kan bruges til at gå fra tal til værdier i et 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 nedarvninger.
// 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(); // normal for-løkke
for (Terning ti : t) System.out.println( ti ); // foreach-løkke
}
}
Da det er umuligt at ændre et arrays størrelse, er det besværligt at at indsætte og slette elementer. Til gengæld kan arrays nemmere indeholde simple typer og man kan initialisere et array på én linje. 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.
Valget er dog ikke så afgørende, da man nemt kan konvertere mellem et array af objekter og en liste (se afsnit 8.7.2).
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å kommandolinjen.
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.