2DArray horizontal und vertikal ausgeben

fischebr

Mitglied
Hallo,
ich habe ein 2D-Array 3x 2 mit einer verschachtelten For-Schleife erstellt. Jetzt möchte ich das Array drehen und vertikal ausgeben. Spontan fiel mir da der Dreieckstausch ein:
Code:
public void turnPlate(int r, int c) {
  int cache = 0;
   
  r = cache;
  cache = c;
  c = r;
  System.out.println(plate[r][c]);
  }
Das funktioniert aber leider nicht, ich bekomme nur einen einzigen wert ausgegeben, wenn ich die Methode auf ein Objekt aufrufe. Hat mal jemand einen Tipp für mich, wie ich ein 2d-Array vertausche?

Vielen Dank!
 

fischebr

Mitglied
Hallo Nuiton,

ich möchte r und c in plate[r][c] vertauschen. Jetzt habe ich auf der Konsole folgende Ausgabe:
b1b1b1
b1b1b1

Mit der turnPlate-Methode möchte ich
b1b1
b1b1
b1b1

ausgeben können.
 

Tarrew

Top Contributor
Du solltest vllt. andere Variablen nehmen anstatt immer "b1" damit man weiß was gemacht werden soll.

Also mal angenommen du hast:
a1b1c1
a2b2c2

soll das Ergebnis dann die transponierte Matrix sein?
a1a2
b1b2
c1c2

oder eine um 90° gedrehte Matrix (zum Beispiel nach rechts)?
a2a1
b2b1
c2c1

Da gibts ja einige Möglichkeiten. Am besten mal sagen, wie genau gedreht werden soll.
 

fischebr

Mitglied
Das zweite. Ich möchte die Matrix um 90° drehen. Diese Matrix soll einen rechteckigen Spielfeldstein darstellen, den ich horizontal oder vertikal legen kann. Im Programm nachher möchte ich diesen Spielfeldstein mit einem Mausklick um 90° drehen und an andere schon liegende Steine anlegen können.
 

Tarrew

Top Contributor
Also hier mal ein Code um eine 2D Matrix im Uhrzeigersinn um 90° zu drehen:
Java:
static int[][] rotateCW(int[][] mat){
    final int M = mat.length;
    final int N = mat[0].length;
    int[][] ret = new int[N][M];
    for(int r = 0; r < M; r++){
        for(int c =0; c < N; c++){
            ret[c][M-1-r] = mat[r][c];
        }
    }
    return ret;
}

Denke, das lässt sich für dein Array leicht anpassen.

Quelle
 
Zuletzt bearbeitet:

fischebr

Mitglied
Sorry, das funktioniert irgendwie nicht. Mit umschreiben bekomme ich keine solche Ausgabe hin.

Und ich habe eh schon redundanten Code, wo ich nicht weiß, wie ich den weg bekommen soll. Hier ist mal meine Klasse:
Code:
public class Plate {
   
     // Eigenschaften
     public String plate[][];
   
     // Konstruktor
     public Plate(int r, int c, String k) {
          plate = new String[r][c];
          for (r = 0; r < plate.length; r++) {                // waagerecht
               for (c = 0; c < plate[r].length; c++) {      // senkrecht
                    plate[r][c] = k;                                  // Codierung Feld
               }
          }
     }
   
     //Methoden
     void showPlate() {                                             // Konsolenausgabe Plate
          for(int r = 0; r < plate.length; r++) {
               for(int c = 0; c < plate[r].length; c++) {
                    System.out.print(plate[r][c]);
               }
               System.out.println();
          }
     }
     
     // dreht das Array um 90°
     public String[][] turnPlate(String[][] plate) {
          int m = plate.length;
          int n = plate[0].length;
          String[][] returnPlate = new String[n][n];
          for(int r = 0; r < plate.length; r++) {
               for(int c = 0; c < plate[0].length; c++) {
                    returnPlate[c][m-1-r] = plate[r][c];
               }
          }
          return returnPlate;
          System.out.println(plate[r][c]);
     }
   
     public void drawPlate() {
          // TODO
     }
}

Bei "System.out.println(plate[r][c])" gibt es immmer einen Compilefehler, egal was ich in die Klammern schreibe.
 

fischebr

Mitglied
Sorry, hatte ich falsch gepostet.

also
Code:
object.turnPlate[String[2][3] plate);
gibt einen
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
   String cannot be resolved to a variable
   Syntax error on token "plate", delete this token

   at Spielkomponenten.Test.main(Test.java:48)
Zeile 48 ist mein Aufruf.
 

Robat

Top Contributor
Wie schon oben beschrieben. Deine Methode erwartet ein 2D-String-Array.
1. würde man einen neuen String mit new String[2][3] plate erzeugen und
2. macht das dort wenig Sinn.

Du willst dein Array drehen, was du vorher erzeugt hast. Dann musst du ihm auch das Array übergeben.
Entweder lässt du den Parameter weg und arbeitest in deiner Plate Klasse nur mit dem plate Array und dem returnPlare Array
oder
du machst dir in deiner Plate Klasse einen Getter für die plate Variable
In deiner Main-Methode (oder wo auch immer du die Methoden aufrust), kannst du dann über object.getPlate(); dein Array holen und es deiner turnPlate() Methode übergeben.

Eine mögliche Lösung (nicht perfekt)
~quick'n'dirty

Java:
// IN DEINER PLATE KLASSE BLEIBT DER REST WIE GEHABT

     public String[][] getPlate() { return plate; }
     
     // dreht das Array um 90°
     public String[][] turnPlate(String[][] plate) {
          int m = plate.length;
          int n = plate[0].length;
          String[][] returnPlate = new String[n][n];
          for(int r = 0; r < plate.length; r++) {
               for(int c = 0; c < plate[0].length; c++) {
                    returnPlate[c][m-1-r] = plate[r][c];
               }
               
          }

          return plate = returnPlate;
     }

und

Als mögliche Main

Java:
        Plate p = new Plate(3, 3, "k");
        p.showPlate();
       
        System.out.println("\n");
        p.turnPlate(p.getPlate());
        p.showPlate();

Gruß
Robert
 

fischebr

Mitglied
Vielen Dank, dass Du dir soviel Mühe gegeben hast. Es wird alles prima kompiliert und ausgegeben, aber der Array ist nicht gedreht.
Ich vermmute mal, dass bei deinem Code die Zeile "String[][] returnPlate = new String[n][n]" eigentlich
"String[][] returnPlate = new String[n][m]" heißen soll? Ist aber egal, mit beiden Möglichkeiten ist das Array nicht gedreht. Magst Du dir ds noch einmal angucken? Weißt Du vielleicht auch, ob man die geschachtelte for-Schleife wirklich dreimal im Code haben muss? es ist ja immer dieselbe Schleife.

Hier noch mal mein geänderter Code:

Code:
public class Plate {
   
     // Eigenschaften
     public String plate[][];
   
     // Konstruktor
     public Plate(int r, int c, String k) {
          plate = new String[r][c];
          for (r = 0; r < plate.length; r++) {                       // waagerecht
               for (c = 0; c < plate[r].length; c++) {             // senkrecht
                    plate[r][c] = k;                                         // Codierung Feld
               }
         }
     }
   
     //Methoden
     void showPlate() {                                                   // Konsolenausgabe Spielfeldplatte
          for(int r = 0; r < plate.length; r++) {
               for(int c = 0; c < plate[r].length; c++) {
                  System.out.print(plate[r][c]);
               }
               System.out.println();
          }
     }
   
     public String[][] getPlate(){
          return plate;
     }
   
     // dreht das Array um 90°
     public String[][] turnPlate(String[][] plate) {
          int m = plate.length;
          int n = plate[0].length;
          String[][] returnPlate = new String[n][m];
          for(int r = 0; r < plate.length; r++) {
               for(int c = 0; c < plate[0].length; c++) {
                    returnPlate[c][m-1-r] = plate[r][c];
               }
           }
           return plate = returnPlate;
  }
   
  public void drawPlate() {
       //TODO
  }
}

Der Aufruf in der Main-Methode sieht wie folgend aus:
Code:
Plate b0 = new Plate(2, 3, "b0");
b0.showPlate();
b0.turnPlate(b0.getPlate());
b0.showPlate();

beide "b0.showPlate();" geben das Gleiche aus.
 

Tarrew

Top Contributor
Versuchs mal so:
Java:
Plate b0 = new Plate(2, 3, "b0");
b0.showPlate();
b0=b0.turnPlate(b0.getPlate());
b0.showPlate();
 

Tarrew

Top Contributor
Sorry war zu schnell von mir.

Das Probem ist, das die gedrehte Matrix zurückgegeben wird. Also entweder setzt du das neu berechnete Array in der turnPlate Methode oder du nimmst den Rückgabewert der Methode und setzt ihn dann als Attribut der Klasse.
 

fischebr

Mitglied
Okay, vielen Dank für den Hinweis. Ich habe jetzt eine Lösung gefunden:
Code:
// dreht das Array um 90°
  public String[][] turnPlate() {
       int m = plate.length;
       int n = plate[0].length;
       String[][] returnPlate = new String[n][m];
       for(int r = 0; r < plate.length; r++) {
            for(int c = 0; c < plate[0].length; c++) {
                 returnPlate[c][m-1-r] = plate[r][c];
            }
       }
       return plate = returnPlate;
  }
public static void main(String[] args) {
Plate b0 = new Plate(2, 3, "b0");
b0.showPlate();
b0.turnPlate();
b0.showPlate();
}
 

fischebr

Mitglied
Sorry!
Code:
public static void main(String[] args) {
     Plate b0 = new Plate(2, 3, "b0");
     b0.showPlate();
     b0.turnPlate();
     b0.showPlate();
   }
 

Ähnliche Java Themen


Oben