Mehrdimensionales Array in einer for-schleife?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die anderen Antworten hier fand ich bis jetzt noch nicht so aufschlussreich. Ich versuche es mal mit meinen Worten zu erklären:

In Java gibt es nicht wirklich mehrdimensionale Arrays. Zumindest nicht so, wie in anderen Programmiersprachen. In Java werden dafür Arrays aus Arrays benutzt, daher können die Unterarrays auch verschieden lang sein.

Du hast also die Variable "ausgabe", die ein Array aus int-Arrays ist und die Länge 3 hat (weil 3 Unterarrays enthalten sind). Die Unterarrays haben aber verschiedene Längen:

{ 
  {2, 3}, // Unterarray 0 mit Länge 2
  {7, 9, 1}, // Unterarray 1 mit Länge 3
  {4} // Unterarray 2 mit Länge 1
}

Um jetzt zu deiner eigentlichen Frage zurückzukommen, warum in der zweiten Schleife b < ausgabe[a].length steht: In der Variable a steht der Index, der grade behandelt wird (also welches Unterarray grade dran ist). Mit ausgabe[a].length wird also die Länge des aktuellen Unterarrays bestimmt. Wenn du das [a] weglassen würdest, also ausgabe.length würdest du stattdessen ermitteln, wieviele Elemente ausgabe hat. In diesem Fall also 3, weil drei Unterarrays in ausgabe stehen.

In einem anderen Kommentar hast du geschrieben "Wenn alle Unterarrays gleich lang sind, würde ja auch (b<ausgabe.length) reichen". Das stimmt so nicht. Wenn beispielsweise jedes Unterarray drei Zahlen hätte, aber insgesamt 10 Unterarrays in ausgabe stehen würden, würdest du eine ArrayIndexOutOfBoundsException kriegen, weil das Programm dann versuchen würde, in jedem Unterarray bis Index 9 zu zählen. Du müsstest also trotzdem ausgabe[a].length oder zumindest ausgabe[0].length benutzen.


Kevin931 
Fragesteller
 28.03.2022, 10:00

Danke das hat mir sehr geholfen jetzt kenne ich mich aus 👍

0

Ein mehrdimensionales Array ist bildlich so aufgebaut:

{
  { 1, 2, 3 },
  { 4, 5, 6 },
  { 7, 8, 9 }
}

Die äußere Schleife läuft durch das äußere Array. Dafür wird der Zähler a verwendet.

Bei jeder Position, an die der Zähler gelangt, steht ein inneres Array, welches mit der inneren Schleife durchlaufen werden soll. Um also auf ein inneres Array zuzugreifen, brauchst du das äußere Array und den Zähler a.

ausgabe[a]

Wenn a bspw. den Wert 0 hat, würde dieser Ausdruck das innere Array { 0, 1, 2 } liefern, bei Wert 1 das innere Array { 4, 5, 6 }, usw..

Die Bedingung für die innere Schleife schaut folgendermaßen, ob der Zähler b kleiner ist, als die Länge des inneren Arrays, bei dem sich die äußere Schleife gerade befindet. Dieses Array wird erst für die Ausgabe durchlaufen, danach folgt der nächste äußere Schleifenlauf und das nächste innere Array wird betrachtet, da der Zähler a eine Position weiterrückt.


Kevin931 
Fragesteller
 27.03.2022, 15:21

Das verstehe ich ja bei deinem Beispiel würde ja auch reichen (b<ausgabe.length), aber die Sache ist wenn man jetzt ein mehrdimensionales Array hat so wie in meinem Fall wo die Werte im Array nicht gleich lang sind also, das erste {2, 3}, das zweite {7,9,1} usw.

Dann braucht man dieses [a] damit die Schleife auch komplett funktioniert und das ist was ich nicht verstehe wieso braucht man in meinem Fall wo das Array nicht gleich lang ist dieses [a]?

Ich hoffe du weißt was ich mein

0
regex9  27.03.2022, 15:55
@Kevin931

Das obige Snippet ist nur eine Verbildlichung eines Arrays. Meinetwegen kannst du den inneren Arrays noch weitere Elemente zufügen oder wegnehmen. Dadurch ändert sich meine Erklärung nicht.

Um mit einer Zählerschleife über das Array zu iterieren, muss dessen Länge bekannt sein, damit der Zähler nicht über den Indexbereich des Arrays läuft (also auf Speicherbereiche zugreift, die dem Array nicht zugeordnet sind). Um die Länge zu ermitteln, muss das Array-Objekt bekannt sein. Um das Array-Objekt heranzuholen, erfolgt der Zugriff über den Index (a) des äußeren Arrays (ausgabe).

0

Diese innere Schleife durchläuft jeweils die darunter liegende Dimension. Die erste Schleife iteriert also durch das ganze Array und "teilt" es in die kleineren Arrays. Das ist die Zählervariable a. Die nächste Schleife iteriert durch diese unteren Arrays, also durch a. Deshalb ist ausgabe[a] das Array wo sie durch iteriert. Im ersten Durchlauf wäre ausgabe[a] also ein Array = {2, 3}

Woher ich das weiß:Hobby – Programmiere seit eineinhalb Jahren

Die Schleife geht zuerst alle Indexe von b durch. Siehst du an: b++ in der zweiten for-Schleife. Es erhöht dabei den Index von b. Dann, wenn die zweite Schleife durch dien Array durchgegangen ist, wird a um ein Wert erhöht. Das siehst du an: a++ in der ersten for-Schleife.

Beispiel bei 3x3 Array:

  • ausgabe[0][0]
  • ausgabe [0][1]
  • ausgabe[0][2]
  • ausgabe[1][0]
  • ausgabe[1][1]
  • usw...
  • bis ausgabe[2][2] ->Dann ist die Schleife fertig.

LG Flo


Kevin931 
Fragesteller
 27.03.2022, 15:13

Ich weiß was du meinst, aber das müsste ja dann auch theoretisch bei b<ausgabe.length, also ohne das [a] funktionieren.

Tut es aber nicht, das heißt das [a] muss irgendeine wichtige Komponente sein damit es funktioniert.

Hoffe du verstehst was ich mein

0
floorian1312  27.03.2022, 15:21
@Kevin931

Da dein b je nach Stelle a, unterschiedliche Längen hat, ist es wichtig, dass du ausgabe[a].length als Bereich mitgibst.

Ansonsten würde die Schleife immer ausgabe[0].length als Grenze nehmen.

Und das stimmt nicht, weil zum Beispiel ausgabe[1].length nicht die gleiche Länge hat wie ausgabe[0].length, zumindest in diesem Fall hat.

0