Java Verständnisproblem: FOR-Schleife und Matrizenoperationen (via Array)

Vulpecula

Commander
Registriert
Nov. 2007
Beiträge
2.245
Hallo zusammen!

Ich habe ein kleines Verständnisproblem bezüglich einer FOR-Schleife in Java. Und zwar habe ich FOR-Schleifen benutzt, um zwei Matrizen (gespeichert in mehrdimensionalen Arrays) miteinander zu multiplizieren. Hier mal der Code dazu:

Code:
for(int zeilen = 0; zeilen < matrix1.length; zeilen++)
{
    for(int spalten = 0; spalten < matrix2[0].length; spalten++)
    {
        for(int zaehler = 0; zaehler < matrix1[0].length; zaehler++)
        {
            ergebnismatrix[zeilen][spalten] += matrix1[zeilen][zaehler] * matrix2[zaehler][spalten];
        }
    }
}

Ich weiß, dass der Algorithmus funktioniert, aber ich verstehe nur noch nicht ganz, wieso er nur so funktioniert. Mein Problem bei der Geschichte sind die Schleifenbedingungen. Nach meinem Verständnis müsste es in der Bedingung für die Schleifen <= (kleiner gleich) heißen, denn sonst wird doch jeweils die letzte Zeile/Spalte (also die letzten Elemente der beiden Arrays) einfach übergangen, oder nicht?

Mein Problem wird eventuell hiermit etwas deutlicher:
Code:
for (int i = 0; i < 3; i++)
{
  System.out.println(i);
}

Diese Schleife gibt i aus, soweit klar. Nur steigt die Schleife ja bei 3 schon aus, also ist der größte ausgegebene Wert von i = 2.

Vielleicht ist da draußen jemand schlauer als ist und kann mich aufklären. :)

MfG
Vulpecula
 
Sagen wir matrix1 hat 10 Werte. Dann gibt matrix1.length "10" zurück. Der erste Werte ist bei matrix1[0] und der letzte, also zehnte Wert steht bei matrix1[9] drin. Wenn er also auf matrix1[10] zugreifen würde, wäre es ein Fehler, also bricht er bei 9 ab.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 sind ingesamt 10 Zahlen.
 
Arrays fangen bei 0 an, von daher ist es schon richtig. Bei i <= length würde es eine ArrayIndexOutOfBoundsException geben.
 
Nein. lenght() und size() liefern Werte ohne die 0. Wenn ein Objekt drin ist, dann bekommst eine 1 und keine 0 zurück. Wenn du in der Schleife mit 0 anfängst, brauchst du einen Schritt weniger.

array[0] = "A";
array[1] = "B";
array[2] = "C";

length gibt 3 zurück, aber du hast nur 0-2 als index. array[3] gäbe indexoutofbounds fehler
 
Zuletzt bearbeitet:
In Java gehen die Indizies eines Arrays mit der Länge n von 0...n-1. Sobald du auf array[n] zugreifen willst, wirst du eine ArrayIndexOutOfBoundException bekommen. Probier es doch einfach mal mit "<=" aus und schaue was der Compiler sagt.
 
Der erste Index in einem Array ist der 0te Index. Length gibt die Zahl der Einträge aus, also bei einem Array mit 3 Einträgen liefert es eine 3 zurück. Um das Array komplett zu durchlaufen muss man die Forschliefe Length-mal abarbeiten; also in diesem Fall 3 mal. Das ist erfüllt wenn die Startbedingung der For-Schleife int i = 0 ist, und die Abbruchbedingung i < Array.Length(). So wäre beispielhaft bei einer Arraylänge von 3, i im ersten Schleifendurchlauf 0 und man würde auf das Anfangselement des Array zugreifen. Beim zweiten Schleifendurchlauf wäre i eins und man würde auf das mittlere Element des Arrays zugreifen. Beim dritten Schleifendurchlauf wäre i zwei und man würde auf das letzte Element zugreifen. Beim vierten Schleifendurchlauf wäre i drei. Damit wäre die Abbruchbedingung erfüllt und man würde auf das Array nicht mehr zugreifen und die Schleife verlassen.
 
Zuletzt bearbeitet:
Ahhhh... Jetzt ist der Groschen gefallen. :D

Ich bin davon ausgegangen, dass .length die Anzahl der Elemente von Null ausgehend zurückgibt, also so wie man auch die Indizies vom Array angeben würde.

Meine interne Fehlerquelle war, dass ich nicht nachgedacht habe, als ich folgendes in der Java-Sprachspezifikation gelesen habe:

The public final field length, which contains the number of components of the array. length may be positive or zero.

Vielen Dank für die Infos! :daumen:

P.S.: @AKFede: Ich hab es schon ausprobiert und das entsprechende Ergebnis erhalten. ;)
 
Zuletzt bearbeitet:
Zurück
Oben