Array

Einführung

Eine wörtliche Übersetzung des Wortes Array aus dem Englischen ins Deutsche liefert: Ansammlung oder Aufstellung.

Ein Array ist ein Container-Objekt, das eine feste Anzahl von Werten eines Datentyps enthält. Arrays werden in Java in einer eigenen Klasse der Standardbibliothek verwaltet. Diese stellt diverse Methoden zur Erzeugung und Wertezuweisung zur Verfügung. Das Array ist ein komplexer Datentyp und ist die Grundlage für die Implementierung unterschiedlicher dynamischer Datenstrukturen wie z.B. der ArrayList, die in der Bibliothek java.util.* bereitgestellt werden.

Test Im folgenden Kaptitel II wird das eindimensionale Array vorgestellt. In der Praxis benötigt man außerdem mehrdimensionale um z.B. eine Matrix darzustellen. In der Bildverarbeitung ist ein Bild eine Matrix von Farb- oder Grauwerten. Im Kapitel III wird auf die Besonderheiten mehrdimensionaler Arrays eingegangen.

Eindimensionale Arrays

Grundsätzlicher Aufbau

Bei der Deklaration eines Arrays wird der eigentliche Container definiert. Das bedeutet, dass das Array zunächst exakt in seiner Größe und Typ bestimmt wird.

(Schematische Darstellung eindimensionales Array http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)

Ein Array setzt sich aus einer festdefinierten Anzahl von Speicherplätzen zusammen. Jeder Speicherplatz kann so genannte Elemente speichern. Jedes Element ist durch seinen numerischen Index abrufbar. Wie in der Abbildung gezeigt, beginnt die Nummerierung mit 0. Das 9. Element, zum Beispiel, ist daher bei Index 8 zu finden.

Die Anzahl von möglichen Speicherplätzen bezeichnet man auch als Länge des Arrays. Die Länge eines Arrays wird festgelegt, wenn das Array erstellt/instanziiert wird. Ein einfaches Array ist ein eindimensionales Array. Ein eindimensionales Array speichert eine Menge von Elementen, so wie ein Bücherregal eine Menge von Bücher aufnimmt.

Syntax

Deklaration

Die Deklaration eines Arrays erfolgt im Beispiel-Programm (siehe Tabelle) durch folgende Codezeile:

// Deklariere ein Array, das nur Integer speichert

int[] einArray;

Wie bei der Deklarationen anderer Variablen besteht eine Array-Deklaration aus drei Komponenten:

  • Sichtbarkeit des Arrays (wurde hier weggelassen)

  • Array-Typ

  • Name des Arrays

Der Datentyp wird vor die eckigen Klammern [] geschrieben (in diesem Beispiel int). Der Datentyp gibt an, welche Datentypen die zu speichernden Elemente haben müssen.

Die eckigen Klammern [] sind Sonderzeichen die dem Compiler anzeigen, dass die deklarierte Variable ein Array ist.

Die Größe des Arrays ist nicht Teil der Deklaration (weshalb die Klammern leer sind). Der Name des Arrays ist - wie bei allen Variablen - freiwählbar. Es sollten aber auch hier die Namenskonventionen eingehalten werden. Wie bei anderen komplexen Datentypen auch, wird durch die Deklaration noch kein Objekt der Klasse Array erzeugt. Hierfür ist eine Initialisierung notwendig.

Im Beispiel wurde ein Array mit dem Datentyp int deklariert. Natürlich können Arrays beliebiger komplexer und primitiver Datentypen deklariert werden:

Sechs Arrays mit primitiven Datentypen:

byte[] einArrayMitBytes;

short[] einArrayMitShorts;

long[] einArraMitfLongs;

double[] einArrayMitDoubles;

boolean[] einArrayMitBooleans;

char[] einArrayMitChars;

Ein Array mit einem komplexen Datentyp:

Mitarbeiter[] einArrayMitMitarbeiter;

Instanziierung und Initalisierung

Die Instanziierung eines Arrays erfolgt mit Schlüsselwort new, gefolgt von dem Datentyp und eckigen Klammern []. In den eckigen Klammern muss die Länge des Arrays festgelegt werden.

// Intialisiere das Array und

//definiere die Länge des Arrays auf 10

einArray = new int[10];

Alternativ kann auch eine Kurzschreibweise verwendet werden, um ein Array zu erzeugen und es initial mit Elementen zu befüllen.

int[] einArray = { 100, 200, 300,400, 500, 600, 700, 800, 900, 1000};

In diesem Beispiel wird das Array deklariert und initialisiert. Es wird also das Array-Objekt erzeugt und mit den in geschweiften Klammern stehenden Werten befüllt. Die Länge des Arrays wird auch hier mit 10 definiert. Die Länge ergibt sich nun durch die Anzahl der Element in den geschweiften Klammern.

Speichern

Mit Hilfe des Gleichheitszeichens und des Index des Arrays können Werte oder Objekte in einem Array gespeichert werden. Der Index in der eckigen Klammer gibt an, in welches Feld des Arrays Elemente gespeichert werden.

// Speichere im Index 0 das 1. Element

einArray[0] = 100;

// Speichere im Index 1 das 2. Element

einArray[1] = 200;

Lesen

Der Zugriff um Elemente aus Arrays auszulesen erfolgt ebenfalls über den Index. Durch Angabe des Array-Namens und des Index in eckigen Klammern wird das Element im Index zurück gegeben.

System.out.println("Element Index 0: " + einArray[0]);

Im Beispiel wird der Integer-Wert im Array mit dem Index 0 zurückgegeben; also die Natürliche Zahl 100.

Beispiel

In einer realen Situation, würden wir wahrscheinlich ein Schleifenkonstrukt wählen, um jedes Element des Array zu durchlaufen. Dieses Beispiel konzentriert sich auf die Array-Syntax und setzt kein Wissen über Schleifen voraus.

class ArrayDemoEindimensional {

public static void erstelleArray() {

// Deklariere ein Array, das nur Integer speicher

int[] einArray;

// Intialisiere das Array und

// definiere die Länge des Arrays auf 10

einArray = new int[10];

// Speichere im Index 0 das 1. Element

einArray[0] = 100;

// Speichere im Index 1 das 2. Element

einArray[1] = 200;

// etc.

einArray[2] = 300;

einArray[3] = 400;

einArray[4] = 500;

einArray[5] = 600;

einArray[6] = 700;

einArray[7] = 800;

einArray[8] = 900;

einArray[9] = 1000;

// Lese einen Wert aus dem Array am Index 0 aus // und übergebe den Wert in die println-Methode.

// Der Wert wird auf der Konsole aus Ausgabe

// angezeigt.

System.out.println("Element Index 0: "

+ einArray[0]);

// Lese einen Wert aus dem Array am Index 1 aus // und übergebe den Wert in die println-Methode.

System.out.println("Element Index 1: "

+ einArray[1]);

// etc.

System.out.println("Element Index 2: "

+ einArray[2]);

System.out.println("Element Index 3: "

+ einArray[3]);

System.out.println("Element Index 4: "

+ einArray[4]);

System.out.println("Element Index 5: "

+ einArray[5]);

System.out.println("Element Index 6: "

+ einArray[6]);

System.out.println("Element Index 7: "

+ einArray[7]);

System.out.println("Element Index 8: "

+ einArray[8]);

System.out.println("Element Index 9: "

+ einArray[9]);

}

}

Ausgabe auf der Konsole:

Element Index 0: 100

Element Index 1: 200

Element Index 2: 300

Element Index 3: 400

Element Index 4: 500

Element Index 5: 600

Element Index 6: 700

Element Index 7: 800

Element Index 8: 900

Element Index 9: 1000

Mehrdimensionale Arrays

Neben eindimensionalen Arrays gibt es auch mehrdimensionale Arrays. Ein mehrdimensionales Array ist eine Menge von eindimensionalen Arrays, ähnlich einer Reihe von Bücherregalen in einer Bücherei.

In der Praxis benötigt man mehrdimensionale um z.B. eine Matrix darzustellen. In der Bildverarbeitung ist ein Bild eine Matrix von Farb- oder Grauwerten.

Grundsätzlicher Aufbau

Wie beim eindimensionalen Array wird der Deklaration eines mehrdimensionalen Arrays ein Container definiert. In diesem Fall hält der Container n Arrays. Ein zweidimensionales Array kann man sich als Matrix oder Tabelle vorstellen. Bekanntermaßen ist jede Zelle einer Tabelle eindeutig durch die Position in einer Reihe und einer Spalte identifizierbar. Um den Inhalt einer Tabellenzelle durch ein bestimmtes Array-Element zu beschreiben, bietet sich ein zweidimensionales Array an: Eine Dimension beschreibt die Reihe, die andere Dimension die Spalte. Angenommen, eine Tabelle hat vier Reihen und drei Spalten, dann ergibt sich folgendes Schema:

Ein dreidimensionales Array lässt sich wie folgt darstellen:

Demo

class zweiDimensionalesArray{

public static void erstelle2DArray(){

// In der ersten Dimension werdenVornamen und

// in der zweiten Nachnamen von Promis gespeichert.

String[][] promis;

// Intialisiere das Array und

// definiere die Länge der ersten

// Dimension auf 10 und der zweiten auf 2.

promis = new String [10][2];

promis [0][0]="Boris"; // Die erste Zelle der Matrix wird befüllt

promis [0][1]="Becker"; // Befüllung der zweiten Zelle

promis [1][0]="Angela";

promis [1][1]="Merkel";

promis [2][0]="Lana";

promis [2][1]="Del Ray";

promis [3][0]="Lukas";

promis [3][1]="Podolski";

// Lese die Werte aus und gebe sie auf

// der Konsole aus.

System.out.println("Aktueller Promi:");

System.out.println(promis [0][0] +" "+ promis [0][1]);

System.out.println("Aktueller Promi:");

System.out.println(promis [1][0] +" "+ promis [1][1]);

System.out.println("Aktueller Promi:");

System.out.println(promis [2][0] +" "+ promis [2][1]);

System.out.println("Aktueller Promi:");

System.out.println(promis [3][0] +" "+ promis [3][1]);

}

}

Ausgabe auf der Konsole:

Aktueller Promi:

Boris Becker

Aktueller Promi:

Angela Merkel

Aktueller Promi:

Lana Del Ray

Aktueller Promi:

Lukas Podolski

Syntax

Deklaration

Mehr-dimensionale Arrays werden durch weitere Klammern deklariert. Zwei Klammern deklarieren ein Zweidimensionales Array; N-Klammern deklarieren ein N-Dimensionales Array.

String[][] promis;

Im Beispiel wird in Array mit dem Namen promis deklariert. Die zwei eckigen Klammerpaare definieren, dass es sich um ein Zwei-dimensionales Array handelt. Die erste Dimension steht in diesem Beispiel für Vornamen und die zweite für Nachnamen.

Instanziiierung und Initalisierung

Die Systematik zur Initialisierung und Instaziierung von mehr-dimensionalen Arrays lässt sich aus dem Konzept für ein-dimensionale Arrays ableiten.

promis = new String [10][2];

Das mehrdimensionale Array wird durch das Schlüsselwort new instanziert und die Längen der Dimensionen werden werden definiert.

Speichern

Um ein Element in der Matrix zu speichern, müssen im zweidimensionalen Array zwei Indizes benannt werden. Nur so lässt sich die Zelle genau bestimmen.

promis [0][0]="Boris";

promis [0][1]="Becker";

promis [1][0]="Angela";

Lesen

Der Zugriff um Elemente aus Arrays auszulesen erfolgt ebenfalls über die Indizis. Durch Angabe des Array-Namens und des Index in eckigen Klammern je Dimension wird die Zelle angesprochen und somit das zugehörige Element zurück gegeben.

System.out.println(promis [0][0] +" "+ promis [0][1]);

Im Beispiel wird für die Zelle(0;0) der String “Boris” und für die Zelle (0;1) der String “Becker” zurückgeben.

Häufige Fehler

ArrayIndexOutOfBounds

Diese Ausnahme (Exception) wird geworfen, um anzuzeigen, dass auf ein Array mit einem falschen Index zugegriffen wurde. Der falsche Index ist entweder negativ oder größer oder gleich der Größe des Arrays. Hierdurch wird auf einen nicht definierten Bereich des Arrays zugegriffen.

Beispiel:Das Array des ersten Demos wurde mit einer Länge von 10 initialisiert:

einArray = new int[10];

Der Zugriff auf den Index 10 wurde die elfte Speicherstelle ansprechen, die es aber nicht gibt.

    • System.out.println("Element Index 11: " + einArray[10]);

    • einArray[10]=1100;

Dies trifft auf Lese- und Schreibzugriffe zu. Dieser Fehler wird vom Compiler nicht erkannt. Er tritt zur Laufzeit auf.

Dies Problem tritt auch bei mehrdimensionalen Arrays auf.

NullPointerException

Diese Ausnahme (Exception) wird ausgelöst, wenn eine Anwendung versucht ein Objekt zu verwenden, aber keines (null) vorfindet. So kann also keine Methode ausgeführt oder auf Attribute zugegriffen werden.

Beispiel:Mitarbeiter [] mitarbeiterListe= new Mitarbeiter [5];

mitarbeiterListe[0]= new Mitarbeiter(“Paul”,”Müller”);

Mitarbeiter aktuellerMitarbeiter = mitarbeiterListe[1];

System.out.println(aktuellerMitarbeiter.gibNachname());

In diesem Beispiel wird ein Array miterabeiterListe mit der Länge 5 erzeugt. Es wird ein Mitarbeiter Objekt in den Index 0 des Arrays geschrieben, aber kein weiteres. Dann wird der Inhalt des Arrays an dem Index 1 ausgelesen. Hier wurde nie ein Objekt abgelegt. Der Inhalt des Arrays mit dem Index 1 ist also null. So ist auch das Objekt aktuellerMitarbeiter null. Die Methode gibNachname() kann also an keinem Objekt ausgeführt werden.

Dies Problem tritt auch bei mehrdimensionalen Arrays auf.