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

8.1.1 Eksempel: Statistik

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

8.1.2 Initialisere et array med startværdier

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,

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

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

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

8.3.1 Polymorfi

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

8.4 Array versus lister (ArrayList)

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:

Et array er godt at bruge, når:

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.

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å kommandolinien.

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.

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/ - af Jacob Nordfalk.
Licens og kopiering under Åben Dokumentlicens (ÅDL) hvor intet andet er nævnt (80% af værket).

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