Java Mehrdimensionale Arrays
Zweidimensionale und höherdimensionale Arrays in Java verwenden, einschließlich gezackter Arrays.
Java hat keinen eigenen „2D-Array"-Typ. Stattdessen gibt es Arrays von Arrays — ein int[][] ist ein Array, dessen Elemente selbst int[]s sind. Die Syntax ist kurz genug, dass sie wie ein eingebautes Raster wirkt, und in den meisten Fällen kann man es auch so verwenden. Wer mit den Grundlagen noch nicht vertraut ist, sollte mit Java Arrays beginnen; diese Seite baut darauf auf, Dimension für Dimension.
Diese Seite behandelt das Deklarieren und Anlegen von 2D-Arrays, das Lesen und Schreiben von Zellen, das Ermitteln von Zeilen- und Spaltenanzahl, das Iterieren, gezackte (nicht-rechteckige) Arrays sowie den seltenen Fall höherer Dimensionen.
Ein 2D-Array deklarieren
Hängt man ein weiteres Klammernpaar an den Typ an:
int[][] grid;
String[][] board;Zuweisung mit zwei Größen — erst Zeilen, dann Spalten:
int[][] grid = new int[3][4]; // 3 rows, 4 columns, all zeroOder mit einem verschachtelten Literal:
int[][] grid = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};Die äußeren geschweifte Klammern enthalten drei Sub-Arrays, jedes der Länge 4.
Auf Elemente zugreifen
Zwei Indizes: erst die Zeile, dann die Spalte.
int[][] grid = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
System.out.println(grid[0][0]); // 1
System.out.println(grid[2][1]); // 8
grid[1][1] = 50; // replace 5 with 50grid[0] allein ist die erste Zeile — selbst ein int[] der Länge 3. Das ist das Wesentliche: Ein einzelner Index liefert eine Zeile, zwei Indizes liefern eine Zelle.
length für Zeilen und Spalten
grid.length ist die Anzahl der Zeilen. grid[r].length ist die Anzahl der Spalten in Zeile r:
int rows = grid.length;
int cols = grid[0].length; // assuming row 0 existsEs gibt kein grid.cols auf oberster Ebene, weil Java nicht voraussetzt, dass jede Zeile dieselbe Länge hat — siehe gezackte Arrays unten.
Iterieren
Die übliche doppelte for-Schleife:
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
System.out.print(grid[r][c] + " ");
}
System.out.println();
}Oder mit der erweiterten for-Schleife, wobei jede Zeile als int[] behandelt wird:
for (int[] row : grid) {
for (int cell : row) {
System.out.print(cell + " ");
}
System.out.println();
}Die erweiterte Form verwendet man, wenn die Koordinaten keine Rolle spielen; die klassische Form, wenn man sie benötigt.
Gezackte Arrays
Die inneren Arrays müssen nicht dieselbe Länge haben. Ein Array von Arrays in Java kann gezackt sein — jede Zeile wird unabhängig dimensioniert:
int[][] triangle = new int[4][]; // 4 rows, columns unspecified
triangle[0] = new int[]{1};
triangle[1] = new int[]{1, 2};
triangle[2] = new int[]{1, 2, 3};
triangle[3] = new int[]{1, 2, 3, 4};new int[4][] ist jede Zeile null, bis man ihr ein Array zuweist. Das Berühren von triangle[0][0] vor triangle[0] = ... wirft eine NullPointerException, keine ArrayIndexOutOfBoundsException. Bei der vollständig dimensionierten Form new int[3][4] werden alle Zeilen erstellt und mit Nullen gefüllt.Oder mit einem Literal:
int[][] triangle = {
{1},
{1, 2},
{1, 2, 3},
{1, 2, 3, 4}
};Das Iterieren funktioniert genauso — man fragt jede Zeile nach ihrer eigenen .length:
for (int r = 0; r < triangle.length; r++) {
for (int c = 0; c < triangle[r].length; c++) {
System.out.print(triangle[r][c] + " ");
}
System.out.println();
}Deshalb ist int[][] ein „Array von Arrays" und keine echte Matrix: Die Sprache erzwingt nicht, dass jede Zeile dieselbe Breite hat.
Höhere Dimensionen
Das Muster lässt sich erweitern. int[][][] ist ein Array von Arrays von Arrays — nützlich für ein 3D-Raster, einen Stapel von Matrizen oder ein RGB-Bild (Höhe × Breite × 3):
int[][][] cube = new int[2][3][4]; // 2 × 3 × 4
cube[0][1][2] = 99;In der Praxis sind mehr als 2D in idiomatischem Java selten — an diesem Punkt ist eine Klasse mit benannten Feldern fast immer übersichtlicher.
Ein durchgearbeitetes Beispiel
Was kommt als Nächstes
Jetzt kennt man Arrays in einer und mehreren Dimensionen. Als Nächstes schauen wir uns die alltäglichen Array-Operationen an — Länge ermitteln, füllen, suchen, kopieren — sowie die Hilfsmethoden der Standardbibliothek, die die meisten davon auf Einzeiler reduzieren.