# 2D Matrix erstellen



## Erag2327 (23. Nov 2022)

Ich will mit einer nested for-Loop eine Matrix erstellen. Diese soll 15 Spalten und 10 Zeilen haben.
Mein Code ist folgender:

```
int anzahlSpalten = 15;
int anzahlZeilen = 10;

int[][] = new field[anzahlSpalten][anzahlZeilen];

for (int i = 0; i < anzahlSpalten; i++) {
    System.out.println();
    for (int j = 0; j < anzahlZeilen; j++) {
        field[i][j] = 0;
        System.out.println(field[i][j]);
    }
}
```

Ich bin mir nicht sicher, wie ich es so hinkriege, dass die Schleife jeweils immer in die nächste Spalte springt.


----------



## httpdigest (23. Nov 2022)

Naja, da Konsolenausgaben immer zeilenweise sind, sollte deine äußere Schleife über die Zeilen (und nicht die Spalten) gehen und deine innere Schleife sollte über die Spalten gehen (und nicht die Zeilen).
Dann kannst du z.B. System.out.print() nutzen für die einzelnen Spalten (nicht println!).
Du _erstellst_ doch aber mit dieser Methode keine Matrix, sondern gibst sie _aus_.
Bzw. macht deine Methode zwei verschiedene Dinge: Sie setzt jedes Element des Arrays auf 0 und gibt es aus.


----------



## Erag2327 (23. Nov 2022)

httpdigest hat gesagt.:


> Naja, da Konsolenausgaben immer zeilenweise sind, sollte deine äußere Schleife über die Zeilen (und nicht die Spalten) gehen und deine innere Schleife sollte über die Spalten gehen (und nicht die Zeilen).
> Dann kannst du z.B. System.out.print() nutzen für die einzelnen Spalten (nicht println!).


Verstehe, könnte man es denn auch so hinbekommen, dass man außen über die Spalten und innen über die Zeilen geht?


----------



## httpdigest (23. Nov 2022)

Erag2327 hat gesagt.:


> Verstehe, könnte man es denn auch so hinbekommen, dass man außen über die Spalten und innen über die Zeilen geht?


Warum?
Das ginge nur, wenn du deine Matrix nur am Ende mit einem einzigen System.out.print/println Aufruf ausgibst, und ansonsten umständliche String-Konkatenationen verwendest.


----------



## Erag2327 (23. Nov 2022)

Hmm, ok, dürfte ich trotzdem vielleicht ein Beispiel davon sehen?


----------



## MarvinsDepression (24. Nov 2022)

Das funktioniert schon, ist aber tatsächlich eher selten.

```
int anzahlSpalten = 15;
int anzahlZeilen = 10;

// int[][] = new field[anzahlSpalten][anzahlZeilen]; <- falsche Syntax
int[][] field = new int[anzahlSpalten][anzahlZeilen];

for (int row = 0; row < anzahlZeilen; row++) {
    System.out.println();
    for (int column = 0; column < anzahlSpalten; column++) {
        field[column][row] = 0; // nach "new int[][]" zum Initialisieren unnötig,
                                // da eh alle Zellen automatisch mit 0 initialisiert werden.
        System.out.print(field[column][row] + " ");
    }
    System.out.println();
}
```
Schlussendlich ist es vom Verwendungszwech des Arrays abhängig, wie man die Dimensionen interpretiert.
Z.B. um ein "Vier Gewinnt" zu programmieren, würde ich das äußere Array auch als Spalten definieren, da es für den Spielverlauf abhängig ist, in welche Spalte ich / der Gegner den nächsten Token legt. Solange das Array rechteckig ist, sind aber stets beide Versionen möglich.


----------



## Erag2327 (24. Nov 2022)

MarvinsDepression hat gesagt.:


> Das funktioniert schon, ist aber tatsächlich eher selten.
> 
> ```
> int anzahlSpalten = 15;
> ...


Danke für die Verbesserung. Wie würde denn beispielhaft eine für Schleife aussehen, die außen die Spalten und innen die Zeilen durchläuft und damit dasselbe Resultat erzielt?


----------



## MarvinsDepression (24. Nov 2022)

das ist für die Konsolenausgabe nur mit umständlichen Umwegen möglich. Wie oben (#2) bereits geschrieben, wird in der Konsole nur zeilenweise ausgegben. Es wäre möglich, für jede Zeile einen String zu schreiben und zum Schluss, wenn sie fertig sind, auszugeben.


----------



## MarvinsDepression (24. Nov 2022)

```
anzahlSpalten = 15;
anzahlZeilen = 10;

int[][] field = new int[anzahlSpalten][anzahlZeilen];
String[] lines = new String[anzahlZeilen];

for (int column = 0; column < anzahlSpalten; column++) {
    for (int row = 0; row < anzahlZeilen; row++) {
        if (column == 0) lines[row] = ""; // <- da bin mir nicht sicher, ob das nötig ist
        
        lines[row] += field[column][row] + " ";
        
        if (column = anzahlSpalten-1) {
            System.out.println(lines[row]);
        }
    }
}
```
So ginge es ohne weitere Schleifen zu verwenden, ist aber grausamer Code.


----------

