# 2 Arrays vertauschen, aber wie ?



## FinalbrainXP (27. Jan 2007)

Hi, ich stehe for einem großen Problem und hoffe es gibt da eine Lösung. Ich will einen 2D Rauchalgorithmus, welcher
recht komplex ist, nach Java portieren. Die Makros von C konnte ich bis jetzt ohne Probleme in Java-Funktionen umwandeln oder gegebenfalls ersetzen. Nun stehe ich vor dem Problem, dass es ein Makro gibt, welches 2 Pointer vertauscht. Aber wie kann ich das in Java umsetzen ?

Hier das C-Makro:

*#define SWAP(x0,x) {float * tmp=x0;x0=x;x=tmp;}*

meine Lösung dazu sieht bis jetzt so aus:


```
public void SWAP(float[] x0, float[] x)
{
        float temp;
         
         for (int i=0; i < x0.length; i++)
         {
            temp  =  x0[i];
            x0[i] = x[i];
            x[i]  = temp;
         }
}
```

Hier muss davon ausgegangen werden, dass die Arrays gleich groß sind. 
Außerdem ist diese Lösung viiiel zu langsam, da Tausende Partikel berechnet werden müssen.
Gibt es da irgendwelche schnelleren Möglichkeiten oder Alternativen ? Ich kann auch die gesamte 
Struktur umstricken, hauptsache ich bekomme dieses vertauschen hin


----------



## Eldar (27. Jan 2007)

Es ist ganz einfach... in Java sind alles Zeiger..
float[] x0 als Übergabeparameter gibt nur einen Zeiger x0 an der auf ein Array vom Typ float zeigt. 
Machst du ein float x[] = x0; zeigt zusätzlich noch ein Zeiger x auf das gleiche Array wie x0. Die Größe wird automatisch angepasst.

Beispiel:

```
int x[] = new int[2];
        int y[] = new int[3]; // Arraydefinitionen
        x[0]=5;
        x[1]=10;
        y[0]=2;
        y[1]=8; 
        y[2]=20;//array befüllen
        for(int i=0;i<x.length;i++)
            System.out.print(x[i]+", ");
        for(int i=0;i<y.length;i++)
            System.out.print(y[i]+", ");    //1. Ausgabe
        int z[] = x;  //hilfsarray;
        x=y;
        y=z; // Arrayzeiger "verbiegen"
        System.out.println();
        for(int i=0;i<x.length;i++)
            System.out.print(x[i]+", ");
        for(int i=0;i<y.length;i++)
            System.out.print(y[i]+", "); //2. Ausgabe
```

Ausgabe:
5, 10, 2, 8, 20, 
2, 8, 20, 5, 10,


----------



## Roar (27. Jan 2007)

dein beispiel funktinoiert nur nich wenn man daraus ne methode machen will, denn 
> float[] x0 als Übergabeparameter gibt nur einen Zeiger x0 an der auf ein Array vom Typ float zeigt. 
is falsch, in java gibt es nur call by value


----------



## FinalbrainXP (27. Jan 2007)

@Eldar..nein so einfach ist das eben nicht, es werden glaube ich nur Kopien der Referenzen übergeben.
Wenn ich diese vertausche, beeinflusst das eben nicht die Original-Referenzen. Aber ich muss leider eine Methode benuzten  Gibt es denn wenigstens was wie nen memcpy unter java oder so..hauptsache ich bekomme die schleife weg  ??


----------



## Beni (27. Jan 2007)

"System.arrayCopy" kann einen ganzen Array, oder auch nur Teile davon, in einen anderen Kopieren.

Wenn du unbedingt eine Methode verwenden musst (wieso auch immer), dann pack doch deine Arrays in einen Wrapper, eine Klasse die nur einen Array beinhaltet. Dann kannst du die Arrays dieser beiden Wrapper austauschen.

```
public final class Wrapper{
  public int[] array;
}

public void swap( Wrapper a, Wrapper b ){
  int[] c = a.array;
  a.array = b.array;
  b.array = c;
}
```


----------



## FinalbrainXP (27. Jan 2007)

Vielen Dank, werde ich mal ausprobieren


----------



## Eldar (27. Jan 2007)

Achso, wenn er natürlich die Methode verlässt gibt es auch die entsprechenden Referenzen nicht mehr und alles ist wieder beim Alten.


----------



## Marco13 (27. Jan 2007)

@FinalbrainXP: Ich würde dir empfehlen, die Arrays direkt dort zu vertauschen, wo sie vertauscht werden müssen. (Und vor allem: NICHT ihre Inhalte mit for-Schleifen oder System.arracopy zu kopieren - das ist überflüssig!). Es gibt in diesem Fall keinen (driftigen) Grund, das mit einer Methode zu machen (was ohne weiteres ja nicht möglich ist). Die drei Zeilen werden dein Programm ja nicht unlesbar machen oder übermäßig aufblähen.   

P.S: FALLS die beiden Arrays zufällig Klassenvariablen sind, kannst du für die zu vertauschenenden Array-Paar ja notfalls spezielle Methoden anbieten ... 

```
private void swapSomeParticles() { float temp[] = this.x; this.x = this.y; this.y = temp; }
private void swapSomeOtherParticles() { float temp[] = this.a; this.a = this.b; this.b = temp; }
```


----------



## FinalbrainXP (28. Jan 2007)

@Marco..ja du hast vollkommen Recht.  Ich wollte den C-Code schön übersichtlich portieren weil dieser leider sehr viele Makros enthält. Aber um ein Auflösen werde ich nicht drumm rum kommen. Habe mittlerweile den Algorithmus am laufen. Das C-Makro vertauscht ja auch nicht wirklich 2 Arrays, wie ich anfangs dachte. Es vertauscht ja auch nur KOPIEN von Pointern, wo die Vertauschung dann nur lokal gilt wo sie auftritt. Meine Sorge hier war demnach sowieso
unberechtigt, da es sich nicht um doppelpointer gehandelt hat


----------

