Arrays

Sidstnævnte pointe:

int[] mineHeltal;                // erklaering (null)
System.out.println(mineHeltal);  // vil give fejl, mangler initialisering
    
mineHeltal = new int[10];        // initialisering (nuller, 0'er)
System.out.println(mineHeltal);  // vil ikke give fejl, er initialiseret

Lad os antage at vi har et array defineret som følger. Vi kan anvende arrayelementer, som det også ses, som alle andre variabler af samme type:

int count[] = new int[4];

count[0] = 7;
count[1] = count[0] * 2;
count[2]++;
count[3] -= 60;

herefter har count[0] værdien 7, count[1] værdien 14, count[2] værdien 1, og count[3] værdien -60. Prøver vi at anvende et index udenfor det definerede antal får vi en ArrayOutOfBoundsException.

Eksempel 4.2. Demo: Array of Doubles
package arraytest2;

import java.util.Arrays;

/**
 * @author nml
 * @version
 */
public class ArrayTest2 {

    public static void main(String[] args) {
        double array[]; // erklær
        array = new double[12]; // initialiser (std)

        System.out.println("Original contents before init: ");
        display(array); // udskriv med statisk metode

        for (int i = 0; i < array.length; i++) {
            array[i] = Math.random() * 10 + i; // initialiser i loop
        }

        System.out.println("Original contents: ");
        display(array); // udskriv med statisk metode

        Arrays.sort(array); // sorter
        System.out.println("Sorted: ");
        display(array); // udskriv med statisk metode

        Arrays.fill(array, 2, 6, -1); // fill fra til med
        System.out.println("After fill(): ");
        display(array);

        Arrays.sort(array);
        System.out.println("After sorting again: ");
        display(array);

        System.out.println("The value -9 is at location ");
        int index = Arrays.binarySearch(array, -1);
        System.out.println(index);
    }

    static void display(double array[]) {
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i] + " ");
        }
        System.out.println("");
    }
    
}

Eksempel 4.3. Demo: Array of Integers
package arraytest1;

import java.util.Arrays;

/**
 * @author nml
 * @version
 */
public class ArrayTest1 {

    public static void main(String[] args) {
        int array[] = new int[10]; // erklær array

        System.out.print("Original contents before own init: ");
        display(array); // udskriv med statisk metode
        for (int i = 0; i < array.length; i++)
                array[i] = -3 * i; // initialiser i loop

        System.out.print("Original contents: ");
        display(array); // udskriv med statisk metode

        Arrays.sort(array); // sorter
        System.out.print("Sorted: ");
        display(array); // udskriv med statisk metode

        Arrays.fill(array, 2, 6, -1); // fill fra til med
        System.out.print("After fill(): ");
        display(array);

        Arrays.sort(array);
        System.out.print("After sorting again: ");
        display(array);

        System.out.print("The value -9 is at location ");
        int index = Arrays.binarySearch(array, -9);
        System.out.println(index);
    }
    
    static void display(int array[]) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println("");
    }
}

Eksempel 4.4. Demo: Two Arrays of Different Types
package arraydemo;

/**
 * @author nml
 * @version
 */
public class ArrayDemo {

    public static void main(String[] args) {
        
        String[] måneder = {"januar", "februar", "marts",
                            "april", "maj", "juni",
                            "juli", "august", "september",
                            "oktober", "november", "december"};
        int i = 0;
        int dagePerMåned[];
        dagePerMåned = new int[12];
        dagePerMåned[i++] = 31;    // januar
        dagePerMåned[i++] = 28;
        dagePerMåned[i++] = 31;
        dagePerMåned[i++] = 30;
        dagePerMåned[i++] = 31;
        dagePerMåned[i++] = 30;
        dagePerMåned[i++] = 31;
        dagePerMåned[i++] = 31;
        dagePerMåned[i++] = 30;
        dagePerMåned[i++] = 31;
        dagePerMåned[i++] = 30;
        dagePerMåned[i++] = 31;     // december

        i = 0;
        while (i < måneder.length) {
            String xs = i == 1 ? "normalt " : "";
            System.out.println(måneder[i] + " har " + xs + 
                               dagePerMåned[i] + " dage");
            i++;
        }
    }
}

For primitive variabeltyper gælder det, at hvis man vil kopiere en variabel, fx således:

int a = 7;
int b = a;
b++;

så har man nu to uafhængige heltalsvariabler, a og b med værdierne 7 og 8. Prøver vi noget tilsvarende for arrays fx

double[] d = new double[4];
double[] e = d;
e[1]++;

så vil både d[1] og e[1] have værdien 1. Hvorfor? Fordi d og e ikke er normale variabel, men referencer til det sted i hukommelsen, hvor vores array befinder sig. Både d og e peger på samme array.

Kopiering af et array må derfor foregå således:

double[] f = new double [3];
int i = 0;
while (i < 4) {
    f[i] = d[i];
    i++;
}
Eksempel 4.5. Demo: Arrays er referencer
package arraydemo1;

/**
 * @author nml
 * @version
 */
public class ArrayDemo1 {

    public static void main(String[] args) {
        int a = 7;
        int b = a;
        b++;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println();

        
        double[] d = new double[4];
        double[] e = d;
        e[1]++;
        System.out.println("d[1] = " + d[1]);
        System.out.println("e[1] = " + e[1]);
        System.out.println();


        double[] f = new double[4];
        int i = 0;
        while (i < 4) {
            f[i] = d[i];
            i++;
        }
        f[1]++;
        System.out.println("d[1] = " + d[1]);
        System.out.println("f[1] = " + f[1]);
        System.out.println();
    }
}