CodeGym /Kurse /JAVA 25 SELF /Gezackte Arrays (Jagged Arrays)

Gezackte Arrays (Jagged Arrays)

JAVA 25 SELF
Level 7 , Lektion 4
Verfügbar

1. Gezackte Arrays unterscheiden sich von zweidimensionalen Arrays

Wir sind bei dem Thema angekommen, das viele „gezackte Arrays“ nennen – auf Englisch jagged arrays. Im Unterschied zu zweidimensionalen Arrays erlauben gezackte Arrays das Speichern von Zeilen unterschiedlicher Länge. Das ist, als hätten Sie einen Gebäudekomplex, bei dem jedes Gebäude eine eigene Anzahl von Wohnungen hat – in einem Gebäude 5 Wohnungen, in einem anderen 20 und im dritten nur eine.

Ein gezacktes Array ist ein Array, dessen jedes Element wiederum ein Array ist; die inneren Arrays (auch „Unterarrays“ genannt) können unterschiedliche Längen haben.

Der Hauptunterschied:

  • In einem zweidimensionalen Array hat jede „Zeile“ (und jede „Spalte“) die gleiche Anzahl von Elementen. Beispiel: int[][] grid = new int[3][5]; – wir haben immer 3 Zeilen mit jeweils 5 Elementen.
  • In einem gezackten Array kann jede Zeile eine andere Länge haben! Beispiel: int[][] jagged = new int[3][]; – und erst danach initialisieren wir jede Zeile (Unterarray) jeweils separat.

So sieht das visuell aus:

Zweidimensionales Array (3x3):
┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┴───┴───┘

Gezacktes Array (unterschiedliche Längen):
┌───┬───┐
│ 1 │ 2 │
├───┼───┼───┬───┐
│ 3 │ 4 │ 5 │ 6 │
├───┼───┴───┴───┘
│ 7 │
└───┘

2. Syntax der Deklaration und Initialisierung eines gezackten Arrays

Die Deklaration eines gezackten Arrays ist nicht schwieriger als die der zuvor betrachteten Typen! Vor den doppelten eckigen Klammern muss man keine Angst haben:


int[][] jaggedArray = new int[3][];
Deklaration eines gezackten Arrays: die äußere Größe ist festgelegt, die inneren Arrays sind noch nicht erstellt

Das bedeutet, wir haben ein Array aus 3 Elementen, und jedes davon ist ebenfalls ein Array von int. Die inneren Arrays sind jedoch noch nicht erzeugt! Zur besseren Verständlichkeit schauen wir uns das ausführlicher an.

Schrittweise Initialisierung eines gezackten Arrays

Schritt 1 – Anlegen des äußeren Arrays:

int[][] jaggedArray = new int[3][];

Jetzt haben wir 3 „Zeilen“, aber sie sind vorerst alle null.

Schritt 2 – Erzeugen und Befüllen der inneren Arrays (Unterarrays):
Nehmen wir an, die erste Zeile hat die Länge 2, die zweite 4, die dritte 3:

jaggedArray[0] = new int[2]; // 2 Elemente in der ersten Zeile
jaggedArray[1] = new int[4]; // 4 Elemente in der zweiten Zeile
jaggedArray[2] = new int[3]; // 3 Elemente in der dritten Zeile

Schritt 3 – Werte eintragen:
Die inneren Arrays sind ganz normale Arrays! Zum Beispiel:

jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;

jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
jaggedArray[1][2] = 5;
jaggedArray[1][3] = 6;

jaggedArray[2][0] = 7;
jaggedArray[2][1] = 8;
jaggedArray[2][2] = 9;

Kurzinitialisierung eines gezackten Arrays

Man kann ein gezacktes Array auch gleich erstellen und befüllen, wenn die Werte bereits bekannt sind:

int[][] jaggedArray = new int[][]
{
    new int[] { 1, 2 },
    new int[] { 3, 4, 5, 6 },
    new int[] { 7, 8, 9 }
};

Oder etwas kürzer, indem man den Typ der inneren Arrays weglässt:

int[][] jaggedArray = 
{
    { 1, 2 },
    { 3, 4, 5, 6 },
    { 7, 8, 9 }
};

3. Iteration und Arbeit mit gezackten Arrays

Die Iteration eines gezackten Arrays ist nicht schwieriger als bei einem zweidimensionalen; nun läuft die äußere Schleife über die Zeilen, und die innere über die Elemente der Zeile (die unterschiedlich lang sein können):

for (int i = 0; i < jaggedArray.length; i++) 
{
    System.out.println("Zeile " + i + ":");
    for (int j = 0; j < jaggedArray[i].length; j++) 
    {
        System.out.print(jaggedArray[i][j] + " ");
    }
    System.out.println();
}

Ausgabe auf dem Bildschirm:

Zeile 0:
1 2 
Zeile 1:
3 4 5 6 
Zeile 2:
7 8 9 

Man kann for-each verwenden, um sich nicht um Indizes zu kümmern:

for (int[] row : jaggedArray) 
{
    for (int value : row) 
    {
        System.out.print(value + " ");
    }
    System.out.println();
}

4. Typische Einsatzszenarien für gezackte Arrays

Wann ist ein gezacktes Array nützlicher als ein zweidimensionales?

  • Wenn Sie für jeden Benutzer eine unterschiedliche Anzahl von Daten speichern: Noten pro Fach, Einkäufe, Kommentare usw.
  • Wenn Ihre Daten eine dreieckige oder stufenförmige Struktur haben (z. B. zum Ausgeben von Pyramiden, Pascals Dreieck usw.).
  • Wenn Sie Speicher sparen möchten: In einem zweidimensionalen Array sind alle Zeilen fix, im gezackten nur die benötigte Anzahl an Elementen.

Beispiel aus der Praxis: Notenmanager für Studierende

Angenommen, wir haben drei Studierende, und das sind ihre Noten für verschiedene Mathematikaufgaben:

Student Noten
0 5, 4
1 3, 4, 4
2 5

Deklarieren wir ein solches Array:

int[][] studentMarks = new int[3][];
studentMarks[0] = new int[] { 5, 4 };         // Erster Student – 2 Noten
studentMarks[1] = new int[] { 3, 4, 4 };      // Zweiter Student – 3 Noten
studentMarks[2] = new int[] { 5 };            // Dritter Student – 1 Note

Geben wir die Noten der einzelnen Studierenden aus:

for (int i = 0; i < studentMarks.length; i++) 
{
    System.out.print("Student " + i + ": ");
    for (int j = 0; j < studentMarks[i].length; j++) 
    {
        System.out.print(studentMarks[i][j] + " ");
    }
    System.out.println();
}

Gezackte Arrays mit anderen Typen verwenden

Gezackt kann ein Array beliebiger Typen sein: von Strings, Arrays anderer Arrays (noch tiefer!) bis hin zu eigenen Objekten.

Beispiel: Array von Strings

String[][] groups = {
    { "John", "Peter" },
    { "Maria", "Alex", "Serge" },
    { "Alice" }
};

5. Dreidimensionale und mehrdimensionale Arrays

Und noch eine interessante Tatsache über Arrays, die Sie sich vielleicht schon denken: Wenn man ein zweidimensionales Array erstellen kann – geht dann auch ein dreidimensionales?

Ja, man kann Arrays beliebiger Dimension erstellen. Solche Arrays nennt man mehrdimensionale.

Wie man mehrdimensionale Arrays deklariert

Es genügt, die benötigte Anzahl von Dimensionen in eckigen Klammern anzugeben:

int[][][] cube = new int[2][3][4]; // 2 "Schichten", 3 Zeilen, 4 Spalten
cube[0][1][2] = 99;

Hier haben wir ein dreidimensionales Array:

  • 2 Elemente entlang der ersten Koordinate,
  • 3 – entlang der zweiten,
  • 4 – entlang der dritten.

Ein solches Array ist ein großer „Datenwürfel“, der fortlaufend gespeichert ist.

Iteration über ein dreidimensionales Array

Der Zugriff auf ein Element erfolgt über alle Indizes gleichzeitig:

for (int i = 0; i < cube.length; i++) 
{
    for (int j = 0; j < cube[i].length; j++) 
    {
        for (int k = 0; k < cube[i][j].length; k++) 
        {
            System.out.print(cube[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println("---");
}
  • Indizes beginnen bei Null, wie üblich in Java.
  • In einem solchen Array gibt es insgesamt 2 × 3 × 4 = 24 Elemente.

Praktische Beispiele für mehrdimensionale Arrays

  • 2D – Tabellen, Schachbretter, Bilder.
  • 3D – „Würfel“ in der Computergrafik, Daten für wissenschaftliche Berechnungen (z. B. Temperatur an verschiedenen Punkten von Raum und Zeit).
  • 4D und höher – werden selten eingesetzt, kommen aber in fortgeschrittener Mathematik, Simulationen, Machine Learning usw. vor.

6. Typische Fehler beim Arbeiten mit mehrdimensionalen Arrays

Fehler Nr. 1: Index außerhalb des Arraybereichs

Der häufigste Fehler ist der Versuch, auf ein nicht existentes Element zuzugreifen, zum Beispiel:

int[][] arr = new int[2][3];
arr[2][0] = 5; // Fehler! Keine Zeile mit Index 2 (es gibt nur 0 und 1)
arr[0][3] = 7; // Fehler! Keine Spalte mit Index 3 (es gibt nur 0, 1, 2)

Bei einem solchen Zugriff wirft das Programm ArrayIndexOutOfBoundsException. Prüfen Sie stets, dass die Indizes in den zulässigen Grenzen liegen: von 0 bis Länge - 1.

Fehler Nr. 2: Nicht initialisierte Zeilen in einem gezackten Array

Wenn man ein gezacktes Array erstellt und vergisst, die inneren Arrays zu initialisieren, kommt es beim Zugriff zu einer NullPointerException:

int[][] jagged = new int[3][];
jagged[0][0] = 5; // Fehler! jagged[0] == null

Zuerst muss das innere Array erzeugt werden: jagged[0] = new int[2];

Fehler Nr. 3: Falsche Verwendung der Arraylänge

Oft verwechselt man matrix.length (Anzahl der Zeilen) und matrix[0].length (Anzahl der Spalten). Besonders häufig beim Kopieren, Iterieren oder Summieren über Spalten.

Fehler Nr. 4: Annahme, dass alle Zeilen gleich lang sind

In gezackten Arrays können Zeilen unterschiedlich lang sein! Wenn Sie matrix[i][j] schreiben, stellen Sie sicher, dass j < matrix[i].length.

Fehler Nr. 5: Verwechslung der Indexreihenfolge

Man verwechselt manchmal, dass zuerst die Zeile und dann die Spalte kommt: matrix[Zeile][Spalte]. Nicht umgekehrt!

1
Aufgabe
JAVA 25 SELF, Level 7, Lektion 4
Gesperrt
Flexibles Achievement-System für den Spieler 🏅
Flexibles Achievement-System für den Spieler 🏅
1
Aufgabe
JAVA 25 SELF, Level 7, Lektion 4
Gesperrt
Gästeliste für das Festessen 🥂
Gästeliste für das Festessen 🥂
1
Aufgabe
JAVA 25 SELF, Level 7, Lektion 4
Gesperrt
Gesamtpunktzahl des Spielers in Minispielen 🎮
Gesamtpunktzahl des Spielers in Minispielen 🎮
1
Aufgabe
JAVA 25 SELF, Level 7, Lektion 4
Gesperrt
Der heißeste Punkt im Gebäude laut Sensorwerten 🔥
Der heißeste Punkt im Gebäude laut Sensorwerten 🔥
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION