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.