MINT lernen

Zweidimensionale Reihungen

Wie merkt sich ein Snackautomat, was in welchem Fach liegt — und in welcher Reihenfolge liest ein Programm eine ganze Tabelle?

1

Tabellen mit Zeile und Spalte

Ein Snackautomat hat drei Reihen mit je vier Schächten. Das Programm speichert für jedes Fach die Anzahl der Snacks — in einer Reihung mit zwei Indizes.

fachs = 0s = 1s = 2s = 3
z = 05207
z = 13841
z = 26092
int[][] leer = new int[3][4];      // 3 Zeilen, 4 Spalten, alle Werte 0
int[][] fach = {
    {5, 2, 0, 7},
    {3, 8, 4, 1},
    {6, 0, 9, 2}
};
int anzahl = fach[1][2];           // Zeile 1, Spalte 2 → 4
  • 2D-Reihung:eine Reihung, deren Elemente selbst Reihungen sind — anschaulich eine Tabelle.
  • Zugriff:fach[z][s] — erst die Zeile, dann die Spalte, beide ab 0.
  • Zeilen:fach.length ist 3 — die Anzahl der Zeilen.
  • Spalten:fach[0].length ist 4 — die Länge einer Zeile.
  • Eine Zeile:fach[1] ist die ganze Reihung {3, 8, 4, 1}.
2

Verschachtelt durchlaufen

Um alle Fächer zu besuchen, braucht man zwei Schleifen: Für jede Zeile läuft die innere Schleife einmal ganz durch alle Spalten.

int gesamt = 0;
for (int z = 0; z < fach.length; z++) {           // äußere Schleife: Zeilen
    for (int s = 0; s < fach[z].length; s++) {    // innere Schleife: Spalten
        gesamt = gesamt + fach[z][s];
    }
}                                                // gesamt = 47
  • Äußere Schleife:wählt die Zeile z und wechselt am langsamsten.
  • Innere Schleife:läuft bei festem z durch alle Spalten s.
  • Durchläufe:Zeilen · Spalten, hier \(3\cdot4=12\) Mal wird der innere Rumpf ausgeführt.
  • Spaltenweise:Schleifen tauschen — außen s, innen z; dann kommt erst eine ganze Spalte.

Wickle die Tabelle mit ▶ oder „Einzelschritt“ in eine lange Reihe ab — so wie die verschachtelten Schleifen sie besuchen. Schalte oben auf „spaltenweise“ um und vergleiche die Farbfolge. Wähle ein Fach (anklicken oder mit den Pfeiltasten und Enter), um seine Position in der Reihe zu sehen.

Tabelle abwickeln


      

Halte fest: Zeilenweise liegen die Werte einer Zeile nebeneinander, spaltenweise die einer Spalte. Welche Reihenfolge entsteht, entscheidet allein die äußere Schleife.

Herleitung:
\(2\cdot4=8\)
| Zeilen davor
Vor fach[2][1] liegen zeilenweise die zwei vollen Zeilen 0 und 1 mit je 4 Werten.
\(8+1=9\)
| Spalten davor
In Zeile 2 steht noch fach[2][0] davor.
\(p=z\cdot\text{spalten}+s\)
Ergebnis
Spaltenweise entsprechend \(p=s\cdot\text{zeilen}+z\).

Zeilensummen verraten, wie voll jede Reihe ist. Für jede Zeile gibt es ein eigenes Ergebnis — also eine Ergebnis-Reihung.

int[] zeilenSumme = new int[fach.length];     // {0, 0, 0}
for (int z = 0; z < fach.length; z++) {
    for (int s = 0; s < fach[z].length; s++) {
        zeilenSumme[z] = zeilenSumme[z] + fach[z][s];
    }
}                                             // {14, 16, 17}
  • Zeilensummen:eine Reihung mit fach.length Plätzen, hier {14, 16, 17}.
  • Spaltensummen:Schleifen tauschen, Ergebnis-Reihung mit fach[0].length Plätzen: {14, 10, 13, 10}.
Merke

int[][] feld = new int[zeilen][spalten];  ·  Zugriff feld[z][s]  ·  Zeilen feld.length  ·  Spalten feld[0].length

3

Allgemeine Hinweise

Erst Zeile, dann Spalte

Wer fach[s][z] schreibt, vertauscht die Indizes. Bei 3 Zeilen und 4 Spalten führt fach[3][0] zum Abbruch mit ArrayIndexOutOfBoundsException.

Zwischensumme je Zeile auf 0

Wird eine einzelne Variable summe benutzt, muss sie innerhalb der äußeren Schleife vor der inneren auf 0 gesetzt werden — sonst wandern die Werte der vorigen Zeile mit.

Innere Grenze aus der Zeile

Mit fach[z].length statt einer festen 4 passt die innere Schleife zu jeder Tabellenbreite, auch wenn sich die Spaltenzahl später ändert.

Videos