javabog.dk  |  << forrige  |  indhold  |  næste >>  |  programeksempler  |  om bogen

8 Arrays

Indhold:

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.

8.1 Erklæring og brug

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.

8.1.1 Eksempel: Statistik

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

8.1.2 Initialisere et array med startværdier

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.

8.1.3 Arrayet i main()-metoden

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".

8.2 Gennemløb og manipulering af array

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.

8.3 Array af objekter

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) };

8.3.1 Polymorfi

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
  }
}

8.4 Arrays versus lister (ArrayList)

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:

Et array er godt at bruge, når:

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).

8.5 Resumé

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

8.6 Opgaver

  1. 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.

  2. Udvid programmet til at kunne lave statistik på kast med et vilkårligt antal terninger.

  3. Ændr programmet, så man kan angive antallet af terninger på kommandolinjen.

8.7 Avanceret

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

8.7.1 Flerdimensionale arrays

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

8.7.2 Konvertere mellem arrays og lister

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

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.

javabog.dk  |  << forrige  |  indhold  |  næste >>  |  programeksempler  |  om bogen
http://javabog.dk/ - Forord af Jacob Nordfalk.
Licens og kopiering under Åben Dokumentlicens (ÅDL) hvor intet andet er nævnt (79% af værket).

Ønsker du at se de sidste 21% af dette værk (267325 tegn) skal du købe bogen. Så får du pæne figurer og layout, stikordsregister og en trykt bog med i købet.