Array im Array einzeln printen lassen?

Aljosha.k

Mitglied
Guten Tag und hallo erstmal an das ganze Forum, ich bin komplett neu hier und freue mich jetzt schon auf zukünftige eventuelle Zusammenarbeit. =)

Nun komme ich zu meiner Frage, ich bin als Java-Anfänger, gerade dabei mir ein 4-Gewinnt-Spiel auf Konsolen-Basis zu programmieren, nun stelle ich die 4x4 Zeilen in einem 2D Array dar und möchte gerne, jenes in die Konsole printen lassen. Mit deepToString habe ich es nun bewerkstelligt, das ganze Array in einer Zeile auszugeben, allerdings möchte ich gerne jedes "Level 2" Array in einer einzigen Zeile anzeigen lassen, um so ein "Feld" zu kreieren.
Wie kann ich das am besten machen?

MfG Aljosha
 
Habe es selber gerade schon hinbekommen, allerdings etwas "umständlicher" =D.
Code:
        for(int x = 3; x>=0; x--){
            for(int y = 3; y>=0; y--){
                System.out.print(arr[y][x]+" ");
            }
            System.out.println("");
        }

Anzeige:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

Vielen dank trotzdem. =)
 
Ist doch vollkommen ok so. Du musst aber nicht rückwärts zählen, aber mach es so, wie du es am besten findest 😉 Und eine kleine Nebensache: beim println musst du nicht unbedingt "" machen ^^
 
Ähnliches hatte ich bereits vor ein paar Tagen in einem anderen Thema geschrieben:

Java:
    static void print(int i) {
        System.out.println("i = " + i);
        for (boolean[] ss : scheibe) {
            System.out.print('[');
            for (boolean s : ss) {
                if (s) {
                    System.out.print("X, ");
                } else {
                    System.out.print("O, ");
                }
            }
            System.out.println(']');
        }
        System.out.println("--- --- ---");
    }

(Vorsicht, wer den Originalbeitrag zitieren möchte, das crasht im Reichen-Texteditor euren Webbrowser 😉 )

Das ist jetzt von der Ausgabe her nicht so schön, prinzipiell funktioniert's aber....
 
Vielen Dank, für die reiche Vielfalt an Ratschlägen, das ich nicht Rückwärts zählen muss, ist mir bewusst, ich mache es allerdings, da ich von "oben" nach "unten" zählen möchte, da die "Chips" ja auch so "fallen" würden. Den Tipp mit array.length werde ich übernehmen. =)
Ich möchte ungerne ein weiteres Thema dafür eröffnen, deswegen stelle ich die Frage mal hier herein.
Ich arbeite an mehreren "Projekten" gleichzeitig um das durch die unterschiedlichen Themen der Projekte gelernte Wissen auf die anderen anzuwenden.
In einem anderen Projekt möchte ich mir Sortier-Algorithmen wie den Bubblesort näher bringen, allerdings hapert es weniger an der Umsetzung dessen, als viel mehr an einem ganz rudimentären Problem, für welches ich Blind zu sein scheine.
Code:
        Scanner scan = new Scanner(System.in);
       
        System.out.println("Automatic/Manual(a/m)");
        System.out.print("Wählen sie eine Option:");
        if(scan.next()=="a"){
            for(int i = 0; i<10; i++){
                arr[i] = r.nextInt(50);
            }
            System.out.println(Arrays.toString(arr));
        }if(scan.next()=="m"){
            for(int i=1; i<10; i++){
                System.out.print("Wert"+i+";");
                arr[i] = scan.nextInt();
            }
        }

Sobald ich einen der beiden Auswahlen treffe, geschieht nichts mehr. Könnt ihr mir verraten woran das liegt?

MfG Aljosha
 
Eigentlich ist es schon besser für sowas ein neues Thema zu erstellen.

Das ganze ist ein typisches Anfängerproblem. Das Problem liegt am Scanner. Eingaben werden sinnvollerweise nicht direkt zum Benutzer gegeben, sondern erst in einem Puffer gespeichert und erst bei einem bestimmten Ereignis (Enter Taste gedrückt) wird der ganze Inhalt des Puffers dem Benutzer gegeben. Das Problem ist aber, dass z.B. nextInt zwar solange wartet bis die Enter Taste gedrückt wurde, aber da die Methode ja nur an der Zahl interessiert ist, wird auf nur die Zahl aus dem Puffer entfernt. Die Enter Taste (also der Wert \n) bleibt jedoch im Puffer. Wenn du danach also nochmal ein nextInt machst, befindet sich eben noch \n im Puffer und liefert sofort den Inhalt des Puffers, immernoch \n.
Um das zu lösen, musst du das \n aus dem Puffer bekommen. Zwei sehr einfache Möglichkeiten wären folgende:
Möglichkeit 1: anstatt scan.nextInt() kannst du Integer.parseInt(scan.nextLine()) verwenden
Möglichkeit 2: nach jedem scan.nextInt() einmal scan.nextLine() aufrufen, um das \n wegzubekommen
 
Scanner::next liefert dir einen String und den vergleicht man mit String::equals und nicht mit ==!
Also:
Java:
if(scanner.next().equals("a")) { /* ... */ }
 
Eigentlich ist es schon besser für sowas ein neues Thema zu erstellen.

Das ganze ist ein typisches Anfängerproblem. Das Problem liegt am Scanner. Eingaben werden sinnvollerweise nicht direkt zum Benutzer gegeben, sondern erst in einem Puffer gespeichert und erst bei einem bestimmten Ereignis (Enter Taste gedrückt) wird der ganze Inhalt des Puffers dem Benutzer gegeben. Das Problem ist aber, dass z.B. nextInt zwar solange wartet bis die Enter Taste gedrückt wurde, aber da die Methode ja nur an der Zahl interessiert ist, wird auf nur die Zahl aus dem Puffer entfernt. Die Enter Taste (also der Wert \n) bleibt jedoch im Puffer. Wenn du danach also nochmal ein nextInt machst, befindet sich eben noch \n im Puffer und liefert sofort den Inhalt des Puffers, immernoch \n.
Um das zu lösen, musst du das \n aus dem Puffer bekommen. Zwei sehr einfache Möglichkeiten wären folgende:
Möglichkeit 1: anstatt scan.nextInt() kannst du Integer.parseInt(scan.nextLine()) verwenden
Möglichkeit 2: nach jedem scan.nextInt() einmal scan.nextLine() aufrufen, um das \n wegzubekommen
InfectedBytes, werde ich in der Zukunft berücksichtigen, allerdings hast du mich vermutlich falsch verstanden, wie du dem Code entnehmen kannst, wird nach einer Auswahl. Nun gebe ich das allererste mal ein a oder m ein und es geschieht nichts mehr, da dann nichts weiter im Code kommt, da scheinbar keine der Wirkungen, der if Abfragen, wirkt. Nur weiß ich nicht wieso....
 
Mein Code sieht momentan wie folgt aus:
Code:
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
       
        System.out.println("Automatic/Manual(a/m)");
        System.out.print("Wählen sie eine Option:");
        String s = scan.next();
        if(scan.next().equals("a")){
            scan.nextLine();
            for(int i = 0; i<10; i++){
                arr[i] = r.nextInt(50);
            }
            System.out.println(Arrays.toString(arr));
        }if(scan.next().equals("m")){
            scan.nextLine();
            for(int i=1; i<10; i++){
                System.out.print("Wert"+i+";");
                arr[i] = scan.nextInt();
            }
        }
 
Lies dir deinen Code mal ganz genau durch.
Erst machst du String s = scan.next();
Diese Variable s ignorierst du aber, stattdessen prüfst du im If dann: scan.next().equals("a")
d.h. du liest schon wieder nen neuen Wert ein. Ob das if nun erfüllt wird oder nicht, danach machst du noch ein If mit if(scan.next().equals("m")
Erstmal solltest du nicht zwei if's nacheinander nutzen, sondern if(...){...} else if(...) {...}
Weiterhin solltest du auch deine Variable s verwenden, anstatt in jedem if einen weiteren Wert zu lesen.

Dazu kommen dann noch die bereits angemerkten Dinge, wie z.B. das Problem mit dem nextInt()
 
Ich habe den Code nun mal abgeändert und den "Manuellen"-Teil herausgenommen, es funktioniert einwandfrei, auch der Sort teil.
Die manuelle Zahlen Eingabe, möchte ich ersetzen durch "Einlesen" von .txt Dateien.


Hier mal der Code, wer ihn ausprobieren mag, oder noch einen Tipp kann.
Code:
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;


public class main {
    static Random r = new Random();
    //static 
    static int v,vv,vvv;
   
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
   
        System.out.println("!Bubblesort!");
        System.out.print("Wieviele Zahlen:");
        int s = scan.nextInt();
        int arr[] = new int[s];
        System.out.print("Wert max.:");
        s = scan.nextInt();
       
        for(int i = 0; i<arr.length; i++){
            arr[i] = r.nextInt(s);
        }
       
        System.out.println("Unsorted:");
        System.out.println(Arrays.toString(arr));
       
        long t1 = System.currentTimeMillis();
       
        while(vv!=1){
            for(int i=arr.length-1; i>0; i--){
                if(arr[i] > arr[i-1]){
                    int sum = arr[i];
                    arr[i] = arr[i-1];
                    arr[i-1] = sum;
                    v=0;
                }
            }
            v++;
            if(v==arr.length){
                vv=1;
            }
            vvv++;
        }
       
        long t2 = System.currentTimeMillis();
       
        System.out.println("Sorted:");
        System.out.println(Arrays.toString(arr));
       
        System.out.println("Durchläufe:"+vvv);
        System.out.println("Benö. Zeit:"+(t2-t1)+"msec.");
        }
}
 
Ja haha das ist n kleiner Tick von mir, den Variablen, denen mir zum Zeitpunkt der Deklarierung kein Name zu einfällt v für value zu geben. Ändere ich nun auch mal. Danke JStein52 ist eine gute Idee, sonst geschehen Abbrüche und Fehlermeldungen.
 
Mit Lokal ist gemeint, dass ich sie in die Methode schreibe in welcher sie Vorkommen oder? Ich dachte static wäre sozusagen "Klassen"-intern. Gibt es dafür kein Attribut(?), ist mir lieber alle auf einem Fleck und somit auf einen Blick zu haben.
 
Mit Lokal ist gemeint, dass ich sie in die Methode schreibe in welcher sie Vorkommen oder? Ich dachte static wäre sozusagen "Klassen"-intern. Gibt es dafür kein Attribut(?), ist mir lieber alle auf einem Fleck und somit auf einen Blick zu haben.
static heißt, der Wert ist nicht an eine Instanz gebunden, sondern "global" und es gibt sie genau ein mal.
Wenn du mit Klassen-Intern meinst, das der Wert nur aus der eigenen Klasse "gesehen" werden kann, meinst du private. Überall sichtbar ist public, im eigenen package und für alle Erben sichtbar wäre protected, und so wie du es hattest, ohne modifier, ist sichtbar fürs eigene Package.

Besser ist, den Scope so klein wie möglich zu haben 😉 So wie es aktuell ist, könnten zB während deine Methode läuft, eine andere Klasse mittendrin alle v's ändern, und deine Methode würde nicht funktionieren 😉
 

Zurück
Oben