Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays

mrkennedie89

Mitglied
Hallo,

ich habe ein kleines Verständnisproblem. Ich habe eine Methode die prüfen soll, ob sich bei einem zweidimensionalen Array mit 3 Zeilen und 3 Spalten
in einer Zeile drei gleiche Werte befinden.
Das Array ist so befüllt:

int[][] spielfeld = {{2, 1, 1}, {1, 1, 1}, {5, 6, 1}};

Wenn ich jetzt unten die Methode ausführe und mir auf der Konsole die Elemente zusammen mit dem String "true" ausgeben lasse, dann erscheint
2, 1, 1, true, 1, 1, 1, 5, 6, 1.

Erwartet hätte ich jedoch, dass "true" erst nach 1, 1, 1 erscheint und nicht bereits davor. Nach meinem Verständnis muss die innere Schleife ja im
zweiten durchlauf der äußeren Schleife erst dreimal durchlaufen werden bevor das Programm überhaupt weiß, dass es "true" ausgeben soll und die Bedingung dafür erreicht worden ist?!

Ich wäre für Hilfe wirklich dankbar.

public static boolean testmethode(int[][] spielfeld) {
int temp = 0; //Hilfsvariable

for (int i = 0; i < spielfeld.length; i++) {

if (spielfeld[0] == spielfeld[1] && spielfeld[1] == spielfeld[2]) {
temp = 1;
System.out.println("true");
}

for (int j = 0; j < spielfeld.length; j++) {
System.out.println(spielfeld[j]);
}

}
if (temp == 1) {
return true;
}
else {
return false;
}
}
 
Als erstes: Bitte Code imme rin Code-Tags schreiben - dazu dient den Knopf </> links oberhalb des Eingabebereichs. Sonst wird z.B. [i] als Start der kursiven Schreibweise ausgewertet.

Das Problem ist, dass Du mehrere Dinge in einer Methode vermischst. Das führt zu genau diesem verhalten. Du kannst ja einmal in Gedanken Deinen Code durchspielen - dann siehst Du es ja auch.

Daher der Hinweis, immer kleine, übersichtliche Methoden zu schreiben.
Und trenne die Ausgabe von Berechnungen.

Du kannst also eine Methode haben, die das Spielfeld ausgibt. Und eine Methode, die nur prüft, ob eine Zeile gleich ist. Und die Ausgabe erfolgt dann an anderer Stelle. Also so in der Art:

Java:
public static boolean testmethode(int[][] spielfeld) {
    gibSpielfeldAus(spielfeld);
    System.out.println(istEineZeileGleich)(spielfeld);
}

public static void gibSpielfeldAus(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        for (int j = 0; j < spielfeld.length; j++) {
            System.out.print(spielfeld[j]);
        }
        System.out.println();
    }
}

public static void istEineZeileGleich(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        if (spielfeld[0] == spielfeld[1] && spielfeld[1] == spielfeld[2]) {
            return true;
        }
    }
    return false;
}

Das sind dann kleine, übersichtliche Methoden, die einfach überschaubar sind.
 
Als erstes: Bitte Code imme rin Code-Tags schreiben - dazu dient den Knopf </> links oberhalb des Eingabebereichs. Sonst wird z.B. [i] als Start der kursiven Schreibweise ausgewertet.

Das Problem ist, dass Du mehrere Dinge in einer Methode vermischst. Das führt zu genau diesem verhalten. Du kannst ja einmal in Gedanken Deinen Code durchspielen - dann siehst Du es ja auch.

Daher der Hinweis, immer kleine, übersichtliche Methoden zu schreiben.
Und trenne die Ausgabe von Berechnungen.

Du kannst also eine Methode haben, die das Spielfeld ausgibt. Und eine Methode, die nur prüft, ob eine Zeile gleich ist. Und die Ausgabe erfolgt dann an anderer Stelle. Also so in der Art:

Java:
public static boolean testmethode(int[][] spielfeld) {
    gibSpielfeldAus(spielfeld);
    System.out.println(istEineZeileGleich)(spielfeld);
}

public static void gibSpielfeldAus(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        for (int j = 0; j < spielfeld.length; j++) {
            System.out.print(spielfeld[j]);
        }
        System.out.println();
    }
}

public static void istEineZeileGleich(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        if (spielfeld[0] == spielfeld[1] && spielfeld[1] == spielfeld[2]) {
            return true;
        }
    }
    return false;
}

Das sind dann kleine, übersichtliche Methoden, die einfach überschaubar sind.
Hallo Konrad,

vielen Dank für deine Antwort. Ja da hast du recht. An der Übersichtlichkeit muss ich noch arbeiten.
 
Java:
public static boolean testmethode(int[][] spielfeld) {
    gibSpielfeldAus(spielfeld);
    System.out.println(istEineZeileGleich(spielfeld));
}

public static void gibSpielfeldAus(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        for (int j = 0; j < spielfeld[i].length; j++) {
            System.out.print(spielfeld[i][j]);
        }
        System.out.println();
    }
}

public static boolean istEineZeileGleich(int[][] spielfeld) {
    for (int i = 0; i < spielfeld.length; i++) {
        if (spielfeld[i][0] == spielfeld[i][1] && spielfeld[i][1] == spielfeld[i][2]) {
            return true;
        }
    }
    return false;
}
 

Neue Themen


Zurück
Oben