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.
| fach | s = 0 | s = 1 | s = 2 | s = 3 |
|---|---|---|---|---|
| z = 0 | 5 | 2 | 0 | 7 |
| z = 1 | 3 | 8 | 4 | 1 |
| z = 2 | 6 | 0 | 9 | 2 |
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.lengthist 3 — die Anzahl der Zeilen. - Spalten:
fach[0].lengthist 4 — die Länge einer Zeile. - Eine Zeile:
fach[1]ist die ganze Reihung{3, 8, 4, 1}.
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
zund wechselt am langsamsten. - Innere Schleife:läuft bei festem
zdurch alle Spaltens. - Durchläufe:Zeilen · Spalten, hier \(3\cdot4=12\) Mal wird der innere Rumpf ausgeführt.
- Spaltenweise:Schleifen tauschen — außen
s, innenz; 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.
Halte fest: Zeilenweise liegen die Werte einer Zeile nebeneinander, spaltenweise die einer Spalte. Welche Reihenfolge entsteht, entscheidet allein die äußere Schleife.
Herleitung:fach[2][1] liegen zeilenweise die zwei vollen Zeilen 0 und 1 mit je 4 Werten.fach[2][0] davor.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.lengthPlätzen, hier{14, 16, 17}. - Spaltensummen:Schleifen tauschen, Ergebnis-Reihung mit
fach[0].lengthPlätzen:{14, 10, 13, 10}.
int[][] feld = new int[zeilen][spalten]; · Zugriff feld[z][s] · Zeilen feld.length · Spalten feld[0].length
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.
