# 2 dimensionale Arrays



## freshman (1. Mai 2008)

Hallo erstmal, tolles Forum hier!!! 


Also zu meinem Problem, ich habe ein 2. dimensionales Array und ein 1. dimensionales Array. Das 1. dimensionale will ich als die zweite Dimension in das 2.dimensionale einbinden ohne eine extra Schleife, nur die Adresse übergeben. Wie geht das?

mein Code:


```
int temp [] = new int [p[0].length];
            int m = p[0].length-1;           
            for (int i = 0; i < p.length; i++){
                for (int j = 0; j < p[i].length; j++){
                     temp[m--] = p [i][j];              
            }//ende innere for-schleife
            p[i] = temp; <---------- bringt nicht das gewünschte Resultat :(
            m = p[0].length-1;
        }//ende auessere for-schleife
```

Die Syntax ist ja Korrekt, der Compiler meckert nicht aber von der Logik.. Wäre für Tips dankbar!


----------



## Wildcard (1. Mai 2008)

> p_ = temp; <---------- bringt nicht das gewünschte Resultat  _


_
Welches i soll das sein? Die Schleife ist doch schon lange vorbei?

Anmerkung am Rande:
Das ist kein n-Dimensionales Array, sondern ein Array von Arrays_


----------



## freshman (1. Mai 2008)

Danke für die schnelle Antwort!!!


```
int temp [] = new int [p[0].length];
    int m = p[0].length-1;           
        for (int i = 0; i < p.length; i++){
               for (int j = 0; j < p[i].length; j++){
                     temp[m--] = p [i][j];             
               }//ende innere for-schleife
               
               p[i] = temp; <---------- bringt nicht das gewünschte Resultat :(

        }//ende auessere for-schleife
```

Das i bezieht sie auf die erste for-Schleife, die Klammer war nicht richtig eingerückt, sorry!

Am besten ein kleines Beispiel:

```
int [][] array = new int [5] [5];
  int [] temp = new int [5] ;
```

angenommen hier wird in beide felder was geladen und jetzt will ich temp in array einbinden als array[5][temp] ohne ein schleife, geht das?


----------



## Marco13 (1. Mai 2008)

Du solltest sagen, wie es sich äußert, dass es "nicht das geüwnschte Resultat" bringt. Vielleicht musst du nur den Array jedes mal neu anlegen (sonst wird nämlich immer der_selbe_ array verwendet)

```
//    int temp [] = new int [p[0].length]; // WEG
            int m = p[0].length-1;           
            for (int i = 0; i < p.length; i++){
                int temp [] = new int [p[i].length]; // HIN
                for (int j = 0; j < p[i].length; j++){
                     temp[m--] = p [i][j];             
            }//ende innere for-schleife
            p[i] = temp; <---------- bringt jetzt vielleicht das gewünschte Resultat?
            m = p[0].length-1;
        }//ende auessere for-schlei
```


----------



## freshman (1. Mai 2008)

Also ich habe ein Bild in einem 2-Dimensionalen Array (länge x breite) gespeichert  und möchte es horizontal spiegeln. Dazu muß ich nur die Zeilen vertauschen. Klappt auch alles, hier die Methode:


```
static void reflect_horizontal (int [][] p){
        int temp [] = new int [p[0].length];
        int m = p[0].length-1;           
        for (int i = 0; i < p.length; i++){
          for (int j = 0; j < p[i].length; j++){
                temp[m--] = p [i][j];              
          }//ende innere for-schleife
          for (int j = 0; j < p[i].length; j++)
                p[i][j] = temp[++m];          
        }//ende auessere for-schleife 
    }//ende reflect_horizontal
```

Jetzt war meine Überlegung das die Schleife in der 9.ten Zeile nicht effektiv sei bzw. nicht notwendig wenn ich es schaffe das 1.Dimensionale Array in das 2.Dimensionale einzubinden. Mein Denkfehler???


----------



## Marco13 (1. Mai 2008)

Hmja, es funktioniert ja so, wie du es jetzt hast. Die Alternativen wären (wie ich schon gesagt hatte) den Array direkt zu setzen (das, was du wohl meintest) - dazu muss er aber immer neu angelegt werden. Oder man verzeichtet ganz auf den Array. Hier mal beide Möglichkeiten....


```
class ReflectTest
{
    public static void main(String args[])
    {
        int a[][] = new int[][]
        {
            { 1,2,3 },
            { 4,5,6 },
            { 7,8,9 },
        };
        print(a);
        reflectHorizontal(a);
        print(a);
        reflect_horizontal(a);
        print(a);


        a = new int[][]
        {
            { 1,2,3,4 },
            { 5,6,7,8 },
        };
        print(a);
        reflectHorizontal(a);
        print(a);
        reflect_horizontal(a);
        print(a);

    }


    static void print(int a[][])
    {
        for (int r=0; r<a.length; r++)
        {
            for (int c=0; c<a[r].length; c++)
            {
                System.out.print(a[r][c]+" ");
            }
            System.out.println("");
        }
        System.out.println("");
    }


    static void reflectHorizontal(int p[][])
    {
        for (int i = 0; i < p.length; i++)
        {
            int len = p[i].length;
            for (int j = 0; j < len / 2; j++)
            {
                int temp = p[i][j];
                p[i][j] = p[i][len-j-1];
                p[i][len-j-1] = temp;
            }
        }
    }

    static void reflect_horizontal(int p[][])
    {
        for (int i = 0; i < p.length; i++){
          int temp [] = new int [p[i].length];
          int m = p[i].length-1;
          for (int j = 0; j < p[i].length; j++){
                temp[m--] = p [i][j];
          }//ende innere for-schleife
          p[i] = temp;
        }//ende auessere for-schleife
    }//ende reflect_horizontal
}
```

So ein kleines, compilierbares Beispiel und eine präzise Fragetellung machen Antworten übrigens einfacher...


----------



## freshman (1. Mai 2008)

Vielen Dank!!!

Ein sehr schöner Algo, gefällt mir sehr gut!!!!

noch eine andere Frage. Jetzt will ich das Bild vertikal spiegeln, dazu muß ich die Spalten vertauschen. Im Feld  a [][] stehen in der ersten Dimension ja bekanntlich Referenzen auf Referenzen. Diese Referenzen kann ich theoretisch in einem 1.Dimensionalen Feld speichern da meckert aber mein Compiler und sagt das a und b nicht kompatiebel sind, ist natürlich klar aber ich möchte in b ja nur die Referenz speichern! Wie mach ich das ihm klar?

Beispiel:


```
int a[][] = new int[][]
        {
            { 1,2,3 },
            { 4,5,6 },
            { 7,8,9 },
        };

        int b [] = new int [3];

        for (int i = 0; i < a.length; i++)
            b[i] = a[i];
```


----------



## Marco13 (1. Mai 2008)

Hm. Diese Methode mit dem Zuweisen des Arrays wird für vertikales Spiegeln grundsätzlich nicht funktionieren. Da musst du dann "per Hand" durchlaufen, ähnlich wie bei der Methode reflectHorizontal (die ohne den temp-Array). Ist eigentlich sowieso "besser", wenn man da nicht dauernd neue Arrays anlegt. Wenn du sagst, dass du ein _Bild_ spiegeln willst, kann das ja schon ein paar Tausend Pixel hoch (bzw. breit) sein - bei der Lösung mit dem Array wird da ziemlich viel Speicher sinnlos allokiert und wieder weggeworfen....


----------



## freshman (1. Mai 2008)

Nochmals Danke!!! Hast mir sehr geholfen!!!


Aber irgendwie klappt das doch nicht


```
static void reflect_vertical (int [][] p){
        int len = p.length;
        int temp;
        for (int i = 0; i < len / 2; i++)
        {
            temp = p[i];
            p[i] = p[len-i-1];
            p[len-i-1] = temp;
            
        }

    }//ende reflect_vertical
```


----------



## freshman (1. Mai 2008)

Wollte wie ein Post weiter oben die Adresse in einem normalen int speichern, ging leider nicht. Hab jetzt ein Array erzeugt. Gibt es eine bessere Möglichkeit?


```
static void reflect_vertical (int [][] p){
  int len = p.length;
  int temp[][] = new int[len][p[0].length];
  for (int i = 0; i < len / 2; i++)
  {
      temp [i] = p[i];
      p[i] = p[len-i-1];
      p[len-i-1] = temp[i];           
  }
}
```

Gruß freshman


----------



## Marco13 (2. Mai 2008)

Doch es geht, und wenn du nur sagst "Es ging nicht", kann man kaum helfen.


----------



## freshman (2. Mai 2008)

Ne leider nicht, weder in BlueJ noch in Eclipse und NetBeans meckert auch. Hier die Fehlermeldung


```
D:\Workspace\Netbeans\Bilder\src\Main.java:47: incompatible types
found   : int[]
required: int
            temp = p[i];
D:\Workspace\Netbeans\Bilder\src\Main.java:49: incompatible types
found   : int
required: int[]
            p[len-i-1] = temp;
2 errors
BUILD FAILED (total time: 0 seconds)
```


----------



## Marco13 (2. Mai 2008)

Hm. Ein bißchen überlegen, was man dort macht, könnte nicht schaden. Wenn du das Bild in einem 2D-Array vertikal spiegeln willst, wirst du (im "Normalfall") nicht drumrumkommen, 2 ineinander verschachtelte Schleifen zu schreiben. Mal' dir das ganze vielleicht mal auf, und überleg' dann, WAS genau du tun musst...


----------



## freshman (3. Mai 2008)

Habs geschafft  :toll: 


```
static void reflect_vertical (int [][] p){
        int len = p.length;
        for (int i = 0; i < len/2; i++){
            for (int j = 0; j < p[i].length; j++){
                int temp = p[i][j];
                p[i][j] = p[len-1-i][j];
                p[len-1-i][j] = temp;
            }
        }       
    }//end reflect_vertical
```

Danke für den Leitfaden!


----------



## Guest (4. Mai 2008)

hallo zusammen

hab zu dem thema auch mal eine frage.

beschäftige mich grade auch mit dem thema. ich will nur in einem bestimmten teil horizonzal spiegeln. habe zum beispiel 2 kreise eingefügt und will bei einem kreis im mittelpunkt spiegeln. bei mir spiegelt jedoch das ganze bild


----------



## Guest (5. Mai 2008)

Na, schein als würde der gute Prof. Taube / Eisenbiegler Euch ganz schön auslasten ^^
viel erfolg noch auch jeden Fall


----------

