# Char-Array erstellen



## actlyc (14. Nov 2016)

Hallo liebe Community,
vorweg möchte ich sagen, dass ich im Thema Programmieren ein kompletter Anfänger bin.
Ich möchte mittels Java ein Feld bzw. ein Spielfeld erstellen. Dieser soll den Dateityp char haben und aus 8 Spalten und 4 Zeilen bestehen. Im Punkt (0/0) soll ein P (Player) stehen. Das restliche Spielfeld soll mit Punkten (.) gefüllt werden. 

Mein Ansatz:

```
public class Spielfeld {
    public static void main(String[] args) {

        char[][] room = {{P,.,.,.},{.,.,.,.}{.,.,.,.}{.,.,.,.}{.,.,.,.}{.,.,.,.}{.,.,.,.}{.,.,.,.}};

        System.out.println(room[0][0]);
        System.out.println(room[0][1]);
        System.out.println(room[0][2]);
        System.out.println(room[0][3]);
        System.out.println(room[1][0]);
        System.out.println(room[1][1]);
        System.out.println(room[1][2]);
        System.out.println(room[1][3]);
        System.out.println(room[2][0]);
        System.out.println(room[2][1]);
        System.out.println(room[2][2]);
        System.out.println(room[2][3]);
        System.out.println(room[3][0]);
        System.out.println(room[3][1]);
        System.out.println(room[3][2]);
        System.out.println(room[3][3]);
        System.out.println(room[4][0]);
        System.out.println(room[4][1]);
        System.out.println(room[4][2]);
        System.out.println(room[4][3]);
        System.out.println(room[5][0]);
        System.out.println(room[5][1]);
        System.out.println(room[5][2]);
        System.out.println(room[5][3]);
        System.out.println(room[6][0]);
        System.out.println(room[6][1]);
        System.out.println(room[6][2]);
        System.out.println(room[6][3]);
        System.out.println(room[7][0]);
        System.out.println(room[7][1]);
        System.out.println(room[7][2]);
        System.out.println(room[7][3]);

    }
}
```

Nun sieht das nicht sonderlich schön aus und es sind eine Menge Fehler drin, welche ich nach und nach abarbeiten muss. Nur würde ich gerne von euch Wissen ob mein Ansatz so in Ordnung ist, welche Fehler vorhanden sind und was man besser machen kann.


----------



## Meniskusschaden (14. Nov 2016)

Mit `System.out.print()`kannst du etwas ohne Zeilenumbruch ausgeben, hier z.B. in der inneren Schleife. Der Zeilenumbruch kommt dann in der äußeren Schleife:

```
for (int line=0; line<room.length; line++) {
    for (int column=0; column<room[line].length; column++) {
        System.out.print(room[line][column]);
    }
    System.out.println();
}
```


----------



## InfectedBytes (14. Nov 2016)

Und die einzelnen Zeichen musst du auch als char eingeben: '.' bzw. 'P'


----------



## prise1993 (14. Nov 2016)

Wenn du alle Felder außer [0] [0] mit '.' befüllst wäre es auch sinnvoll, das in einer Schleife zu erledigen!

```
char[][] room = new char[4][8];

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 8 ; j++) {
                room[i][j] = '.';
            }
        }
        room[0][0] = 'P';
```


----------



## actlyc (15. Nov 2016)

Also muss ich die einzelnen Chars alle mit Bsp. '.' ergänzen und kann die ganze Schreibarbeit auch kurz durch einer Schleife ersetzen. 

Was genau bedeutet das ++ nach dem i?


----------



## VfL_Freak (15. Nov 2016)

Moinsen,


actlyc hat gesagt.:


> Was genau bedeutet das ++ nach dem i?


guckst Du hier:  https://de.wikipedia.org/wiki/Inkrement_und_Dekrement

Gruß Klaus


----------



## Xyz1 (15. Nov 2016)

Ich denke, der beste Weg könnte hier sein:

```
Character[][] room = IntStream.range(0, 8).mapToObj(x -> IntStream.range(0, 4).mapToObj(y -> x == 0 && y == 0 ? 'P' : '.').toArray(Character[]::new)).toArray(Character[][]::new);
        System.out.println(Arrays.deepToString(room));
        System.out.println("/* oder */");
        Arrays.stream(room).forEach(array -> System.out.println(Arrays.toString(array)));
```

Wo dann die Ausgabe lautet:

```
[[P, ., ., .], [., ., ., .], [., ., ., .], [., ., ., .], [., ., ., .], [., ., ., .], [., ., ., .], [., ., ., .]]
/* oder */
[P, ., ., .]
[., ., ., .]
[., ., ., .]
[., ., ., .]
[., ., ., .]
[., ., ., .]
[., ., ., .]
[., ., ., .]
```

Der aufmerksame Leser wird vielleicht schon gemerkt haben, dass ich die Definition leicht geändert habe. Liegt einfach daran, dass Java 8 alles kleiner als int als int ansieht.


----------



## JStein52 (15. Nov 2016)

DerWissende hat gesagt.:


> Character[][] room = IntStream.range(0, 8).mapToObj(x -> IntStream.range(0, 4).mapToObj(y -> x == 0 && y == 0 ? 'P' : '.').toArray(Character[]::*new*)).toArray(Character[][]::*new*);
> System.out.println(Arrays.deepToString(room));
> System.out.println("/* oder */");
> Arrays.stream(room).*forEach*(array -> System.out.println(Arrays.toString(array)));


Das ist ja gut und schön. Aber der TE ist totaler Anfänger, d.h. er wird kein Wort davon verstehen.


----------



## Xyz1 (15. Nov 2016)

Also .flatMap() geht nur mit >= int ...

Verschachtelte Schleifen und eine Redundanz ist doch auch nicht einfach zu verstehen! D. h., am besten gleich die richtige Schreibweise angewöhnen.

Programmieren ist nun mal kein Ponnyhof!


----------



## InfectedBytes (15. Nov 2016)

DerWissende hat gesagt.:


> Also .flatMap() geht nur mit >= int ...
> 
> Verschachtelte Schleifen und eine Redundanz ist doch auch nicht einfach zu verstehen! D. h., am besten gleich die richtige Schreibweise angewöhnen.
> 
> Programmieren ist nun mal kein Ponnyhof!


Lambdas und Streams sind schön und gut, aber an dieser Stelle nunmal nicht der richtige Weg.


----------



## Xyz1 (15. Nov 2016)

Vielleicht würd ich in dem Fall, das Array room sogar tatsächlich explizit aufschreiben ... etwas C&P ist ja nicht schlimm. 

Bearbeitung: /**/ in String-Literalen ist auch etwas confusing indentation fällt mir gerade auf ...


----------



## VfL_Freak (15. Nov 2016)

Moin,

OFFTOPIC:


DerWissende hat gesagt.:


> Programmieren ist nun mal kein Ponnyhof!


nein ... allenfalls ein _*Ponyhof*_


----------



## actlyc (15. Nov 2016)

In meiner Aufgabenstellung wird explizit verlangt, ein Array des Typ char zu erstellen. Trotzdem danke für den Ansatz .
Habe jetzt das Spielfeld mit der Schleife von @prise1993 erstellt. Der Compiler führt aus aber das Programm gibt in der Konsole nichts aus.

Quellcode:

```
public class SpielfeldPrise {
    public static void main(String[] args) {
        char[][] room = new char[4][8];

                for (int i = 0; i < 4; i++) {
                    for (int j = 0; j < 8 ; j++) {
                        room[i][j] = '.';
                        room[0][0] = 'P';
                    }

                }
              
            room[0][0] = 'P';

            }          
        }
```


----------



## VfL_Freak (15. Nov 2016)

Moin,

mal davon angesehen, dass Du Dir das "_*room[0][0] = 'P'*_" in der for-Schleife sparen kannst, wird das Array bei mir sauber gefüllt ! 
Was erwartest Du denn sonst ?? Eine Ausgabe ??
Die müsstest Du dann aber noch programmieren ..... 

Gruß Klaus


----------



## JStein52 (15. Nov 2016)

Was sollte er auch ausgeben ?  Du hast keine Ausgaben in deinem Programm

Edit: Klaus war schneller


----------



## JStein52 (15. Nov 2016)

Schau mal was @Meniskusschaden oben im Post #2 geschrieben hat


----------



## VfL_Freak (15. Nov 2016)

Moin,


JStein52 hat gesagt.:


> Schau mal was @Meniskusschaden oben im Post #2 geschrieben hat


Hat nur noch den kleinen Schönheitsfehler, das _*room[0][0]='P'*_ fehlt 
Aber das solltest Du doch jetzt wohl selbst hinbekommen, oder ??


----------



## JStein52 (15. Nov 2016)

VfL_Freak hat gesagt.:


> Hat nur noch den kleinen Schönheitsfehler,


Nö, wieso ? Da gehts doch um das Ausgeben


----------



## VfL_Freak (15. Nov 2016)

JStein52 hat gesagt.:


> Nö, wieso ? Da gehts doch um das Ausgeben


ach so, mit der Deklaration aus Post#1 ... 
Ok - mea maxima culpa


----------



## actlyc (15. Nov 2016)

Habe das System.out.println eingefügt. Wenn ich nur das P ausgeben will funktioniert es. Der Compiler gibt jedoch bei der Ausgabe von i und j Fehler an.


```
public class SpielfeldPrise {
    public static void main(String[] args) {
        char[][] room = new char[4][8];

                for (int i = 0; i < 4; i++) {
                    for (int j = 0; j < 8 ; j++) {
                        room[i][j] = '.';
                        room[0][0] = 'P';
                    }

                }

                        System.out.println(room[0][0]);
                        System.out.println(room[int i][int j]);
            }

        }
```

Fehler: 
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff} span.s1 {font-variant-ligatures: no-common-ligatures}

SpielfeldPrise.java:14: error: '.class' expected

                        System.out.println(room[int i][int j]);

                                                    ^

SpielfeldPrise.java:14: error: ')' expected

                        System.out.println(room[int i][int j]);

                                                    ^

SpielfeldPrise.java:14: error: '.class' expected

                        System.out.println(room[int i][int j]);

                                                          ^

SpielfeldPrise.java:14: error: not a statement

                        System.out.println(room[int i][int j]);

                                                      ^

SpielfeldPrise.java:14: error: ';' expected

                        System.out.println(room[int i][int j]);

                                                            ^

SpielfeldPrise.java:14: error: illegal start of expression

                        System.out.println(room[int i][int j]);

                                                            ^


----------



## VfL_Freak (15. Nov 2016)

Du bist mit Deinem SysOut außerhalb aller Schleifen und deklarierst zu allem Überfluß i und j neu !!  

Lies doch Post#2 !!!


----------



## JStein52 (15. Nov 2016)

Dann kopiere doch einfach mal das von @Meniskusschaden  in deinen Code


----------



## actlyc (15. Nov 2016)

Habe "   System.out.println(); " von @Meniskusschaden benutzt. Kriege nur leerzeichen bzw. gar nichts ausgespuckt. Kann mir jemand noch mal verständlich erklären, mit welchem System.out ich das Spielfeld aus Punkten und mit einem P bei [0][0] ausgeben kann.


----------



## VfL_Freak (15. Nov 2016)

System.out.print( room_[j] );__      // *ohne *Zeilenende und -umbruch
System.out.println( room[j] );  // *mit* Zeilenende und -umbruch

und room[0][0] nur einmalig !!

Jetzt muss es nur noch an die richtigen Stellen _


----------



## VfL_Freak (15. Nov 2016)

sorry, irgendwie über der Editor meine Bearbeitung nicht .... 

System.out.print( room_[j] );__      // *ohne *Zeilenende und -umbruch
System.out.println( room[j] );  // *mit* Zeilenende und -umbruch

und room[0][0] nur einmalig !!

Jetzt muss es nur noch an die richtigen Stellen _


----------



## JStein52 (15. Nov 2016)

actlyc hat gesagt.:


> Habe " System.out.println(); " von @Meniskusschaden benutzt.


Du musst den kompletten Code von Post #2 hinter deine Schleifen zum befüllen des Arrays kopieren. Hinter deine Schleifen. Nicht mitten hinein.


----------



## VfL_Freak (15. Nov 2016)

hmm, im Editor steht bei mir "*room[j]*_", aber nach dem Abschicken nur "*room[j]*" ????
Ich glaube, ich muss mal nen Neustart machen ... _


----------



## prise1993 (15. Nov 2016)

```
public static void main(String[] args) {
        char[][] room = new char[4][8];

        for (int i = 0; i < 4; i++) {   //hier wird das ganze Array mit '.' gefüllt
            for (int j = 0; j < 8 ; j++) {
                room[i][j] = '.';
            }
        }
        room[0][0] = 'P';            //Feld 0/0 wird mit 'P' gefüllt muss nur
                                  // 1* gemacht werden deshalb nicht in for

        for (int i = 0; i < 4 ; i++) {     //hier wird das Array Ausgegebn
            for (int j = 0; j < 8; j++) {
                System.out.print(room[i][j]);
            }
            System.out.println(); // Zeilenumbruch
        }

    }
```

Die erste Schleife befüllt, die zweite gibt aus! Du musst jedes Feld durchgehen!
Die Ausgabe sieht dann so aus:

```
P.......
........
........
........
```


----------



## actlyc (15. Nov 2016)

@prise1993 Perfekt, hat funktioniert!
Könnte ich mich bei dir über pn melden, wenn ich noch fragen habe?


----------



## prise1993 (15. Nov 2016)

@actlyc Kein Problem


----------



## Xyz1 (15. Nov 2016)

actlyc hat gesagt.:


> In meiner Aufgabenstellung wird explizit verlangt, ein Array des Typ char zu erstellen. Trotzdem danke für den Ansatz .


Wird aber keinen Unterschied geben ...
Naja, dann machs so (echtes char-Array erstellen und drucken):

```
Character[][] room = IntStream.range(0, 8).mapToObj(x -> IntStream.range(0, 4).mapToObj(y -> x == 0 && y == 0 ? 'P' : '.').toArray(Character[]::new)).toArray(Character[][]::new);
        char[][] realFlatRoom = new char[8][4];
        IntStream.range(0, 8).forEach(i -> IntStream.range(0, 4).forEach(j -> realFlatRoom[i][j] = room[i][j]));
        // Jetzt gebe ich etwas aus...:
        // Stream.of(realFlatRoom).forEach(array -> System.out.println(Arrays.toString(array)));
        Stream.of(realFlatRoom).flatMap(Stream::of).forEach(System.out::println);
```


----------



## JStein52 (15. Nov 2016)

DerWissende hat gesagt.:


> Naja, dann machs so


Irgendwie lässt du heute nicht locker mit dem Lambda-Unfug ?  Er hat doch schon seine Lösung. Nimm dir ein Beispiel an @prise1993 , so gehts.


----------



## InfectedBytes (15. Nov 2016)

Schon ein extremer Fall von Lambda Missbrauch


----------



## Flown (15. Nov 2016)

@DerWissende warum nicht gleich:

```
char[][] realFlatRoom = new char[4][8];
IntStream.range(0, realFlatRoom.length).forEach(i -> IntStream.range(0, realFlatRoom[i].length)
    .forEach(j -> realFlatRoom[i][j] = i == 0 && j == 0 ? 'P' : '.'));
Stream.of(realFlatRoom).flatMap(Stream::of).forEach(System.out::println);
```

@InfectedBytes es ist nicht wirklich ein Missbrauch, wenn mans richtig anstellt.

Aber die richtige Lösung für einen Anfänger, sind und bleiben nun mal 2 for-Schleifen.
Man sollte schon mal den bei den Grundlagen anfangen und das sind nunmal explizite und keine impliziten Iterationen.


----------



## Xyz1 (15. Nov 2016)

@Flown : Mein Ziel war es, alles innerhalb einer Zeile zu schreiben; so hast du jetzt 2, Initialisierung und Zuweisung, wenn man so will.
@ all : Es mag Unfug sein, aber genau nach diese n Unfug wurde gefragt. 
Außerdem war das auch für mich eine Trainingssession. Dass man Ponyhof nur mit einem 'n' schreibt, kann ich ja nicht wissen. 
@prise1993 hat zwar etwas ganz Tolles geschrieben, aber ob es mittlerweile bei uns durch Code review kommt. 
Naja, für heute geb ich erst mal Ruhe.


----------



## JStein52 (15. Nov 2016)

actlyc hat gesagt.:


> Was genau bedeutet das ++ nach dem i?


Wenn du diese Frage des TE siehst, glaubst du dann wirklich dass er mit deinem Code auch nur ansatzweise was anfangen kann ? Deshalb hatte ich deinen Code Unfug genannt. Nicht weil er irgendwelchen Codereviews nicht genügen würde.


----------

