Beispiel zum Einstieg

In einem Java-Programm soll eine Oberstufenklausur ausgewertet werden. Dafür sollen nach Eingabe der Anzahl der einzelnen Notenpunkte das Minimum, das Maximum, der Mittelwert und der Anteil negativer Noten angegeben werden. Zudem soll die Notenverteilung in einem (Sternchen-)Streifendiagramm ausgegeben werden.

Möchten wir für jede mögliche Note die Anzahl der zugehörigen Klausuren erfassen, benötigen wir 16 Variablen vom Datentyp intnote0, note1, …, note15. Nun ist sowohl die Eingabe als auch die Verarbeitung einer solchen Menge an Variablen sehr aufwändig … ganz abgesehen davon lassen sich Aufgaben finden, die eine wesentlich größere Anzahl an Variablen benötigen. Man könnte ja auch 100000 Messwerte erfassen – dafür bräuchte man dann 100000 Variablen und müsste z.B. alle diese 100000 Variablen addieren um später den Mittelwert zu berechnen … das dürfte extrem unkomfortabel sein.

Die Lösung für dieses Problem ist der Datentyp array. Ein array ist eine Reihe von Elementen (gleichen) Datentyps. Die einzelnen Elemente können über einen Index angesprochen werden. In Feldern kann man eine begrenzte Anzahl gleichartiger Daten speichern. Im Gegensatz zu einfachen Datentypen wie int, double, char oder boolean ist ein Feld ein strukturierter Datentyp.

Was ist ein Array – Deklaration und Initialisierung

Die Struktur eines Feldes mit n Elementen wird im Bild beispielhaft deutlich. Jedes Element kann einen Wert vom Datentyp int speichern.

Jede Zahl befindet sich in einer Zelle des Feldes. Alle Zellen sind gleich groß und können genau eine Zahl aufnehmen. Nicht alle Zellen des Feldes sind belegt, es können noch weitere Zahlen im Feld gespeichert werden. Das erste Feldelement hat den Wert 17 und den Index 0 (Merke: Computer zählen ab Null, Menschen normalerweise ab Eins), das zweite Element hat den Wert 64 und kann über den Index 1 angesprochen werden usw.. Ein Feld könnte man sich demzufolge als eine Vielzahl an Variablen vorstellen, die alle den gleichen Namen haben, sich nur durch ihren Index unterscheiden. Wir kennen so etwas ähnliches auch aus der Mathematik: Nullstellen einer Polynomfunktion werden alle mit x bezeichnet, erhalten von uns jedoch einen Index … also x_0, x_1, ...

Deklariert werden Arrays durch Kennzeichnung der Feldvariablen mit dem Klammernpaar [] hinter dem Datentyp.

int[] noten;

Zum Anlegen eines Arrays benötigt man die new-Methode. Ein Array ist der einzige Datentyp, der auf diese Art initialisiert werden muss, da Arrays in Java Objekte sind (im Gegensatz zu anderen Programmiersprachen). Im Beispiel wird das Array zur Aufnahme von maximal 16 Elementen initialisiert.

noten = new int[16];

Weiß man zu Beginn schon, wie groß das Array werden soll, kann Deklaration und Initialisierung in einem Schritt erfolgen:

int[] noten = new int[16];

Auf ein einzelnes Feldelement greift man nun über den Index zu. Im folgenden Beispiel wird dem Feldelement mit dem Index 7 die Zahl 5 zugewiesen, danach werden allen Zellen mit den Indizes 0 bis 6 Zufallszahlen von 0 … 4 zugewiesen und ausgegeben.

noten[7] = 5;
  for (int i = 0; i < 7; i++) {
    noten[i] = (int) (Math.random()*5);
    System.out.println(noten[i]);
  }

Zählschleifen sind für die Arbeit mit Arrays ein wichtiges Element, da sehr häufig das Feld durchlaufen werden muss (z. B. zum Einlesen oder Ausgeben der Elemente, zum Aufaddieren oder zur Suche nach dem Minimum, … ). Die Länge des Arrays (entspricht Anzahl der Elemente) kann mit array.length ausgelesen werden. Hier ein Beispiel für eine Anwendung:

public class BspArray {
    static int[] werte = new int[10];

    public static void gibWerteAus() {
        System.out.print("Werte des Feldes:");
        for (int i = 0; i < werte.length; i++) {
            if (i % 5 == 0) {
                System.out.println();
            }
            System.out.printf( "%6d", werte[i]);
        }
    }

    public static int sucheMin() {
        int m = werte[0];
        for (int i = 1; i < werte.length; i++) {
            if (werte[i] < m) {
                m = werte[i];
            }
        }
        return m;
    }

    public static void main(String[] args) {
        for (int i = 0; i < werte.length; i++) {
            werte[i] = (int) (Math.random()*1000);
        }

        gibWerteAus();
        System.out.println("\nDer kleinste Wert ist " + sucheMin());
    }
}
  • Was gibt das Programm aus?
  • Weshalb ist es besser in der Methode sucheMin die Variable m mit dem ersten Faldelement zu belegen und nicht z. B. mit 0 (oder gar nicht)?

Besonderheiten

Belegung mit Startwerten

Sind die Werte (alle Werte) bei der Initialisierung des Arrays schon bekannt, kann man diese bei der Initialisierung als Liste in geschweiften Klammern angeben:

int[] primzahlen20 = {2, 3, 5, 7, 11, 13, 17, 19};

foreach-Schleife bei Feldern

Zum Durchlaufen von Arrays kann man neben der for-Schleife auch eine foreach-Schleife nutzen. Diese Art der Schleife würde z.B. für die oben verwendete Methode sucheMin wie folgt aussehen:

public static int sucheMin() {
        int m = werte[0];
        for (int einWert : werte) {
            if (einWert < m) {
                m = einWert;
            }
        }
        return m;
    }

Vorteile der foreach-Schleife:

  • Es muss keine Abbruchbedingung festgelegt werden.
  • Es wird immer das komplette Array durchlaufen.
  • Man benötigt keinen Startwert.
  • Die foreach-Schleife startet immer beim ersten Element.
  • Um die Erhöhung der Zählvariablen braucht man sich nicht kümmern.
  • Es wird immer das komplette Array durchlaufen.

Nachteile der foreach-Schleife:

  • Das Array wird immer vom ersten bis zum letzten Element durchlaufen. Somit kann man wirklich nur Standarddurchläufe realisieren. (Es gibt auch hier natürlich Möglichkeiten, dies zu umgehen – damit gehen aber de Vorteile der foreach-Schleife verloren.)
  • Für die Eingabe von Werten auf dem Feld ist die Schleife eher ungeeignet.

Erklärvideos

Als Zusammenfasung und Ergänzung …

Schlagwörter: