Swap

Eichelhäer

Bekanntes Mitglied
Hallo, bestimm schon hundertmal gefragt.
Ich habe ne swap methode zum swappen zweier double werte einfach:
Java:
public static void main(String[] args) {
        
        double first = 1.0;
        double second = 2.0;
        
        swap(first,second);
        
        System.out.println(first + "   " + second);
    }
    
    private static void swap(double first,double second) {
        double tmp = first;
        first = second;
        second = tmp;
    }

Sorry is wahrscheinlich ne dumme Frage, aber nach Aufruf der Methode bleiben die Werte gleich, Wieso?
 
Double ist ein ptimitiver Datentyp der Methode wird eine Kopie übergeben.

Tipp gib es mal in der Methode aus da wird es stimmen.

Java call by Value
 
Zuletzt bearbeitet:
Mit dem primitiven Datentyp geht das nicht. Benutze ein Objekt. Vielleicht einen Array vom Typ double. Und greife in der Methode auf die values zu.
 
Hm. Ok. Was aber gehen würde, wäre für jedes Variablenpaar das ich habe jeweils einzeln den Inhalt meiner swap funktion aufzurufen?
ja - aber eher nicht sinnvoll, weil das sehe dann so aus:

Java:
 double first = 1.0;
double second = 2.0;
double tempFirst = swapFirst(first,second);
double second = swapSecond(first,second); 
double first=tempFirst;
Dann kannst du dir die Swap-Funktionen auch sparen.

So ein Tausch ist etwas, da lohnt es in Java nicht das in eine Methode auszulagern, weil man den eh sehr sehr sehr selten braucht und dann kann man ihn auch direkt hinschreiben:
Java:
 double first = 1.0;
double second = 2.0;
double tempFirst = second;
double second = first;
double first=tempFirst;
 
Eine Möglichkeit wäre die Wrapper-Klasse Double zubenutzen. Zugriff auf den Wert in der Klasse mit doubleValue().
Nö, auch das funktioniert natürlich nicht.

Ein Double ist ein Wertetyp, d.h. Du kannst den Wert einer Double Instanz nicht verändern.

Und doubleValue() braucht man meist auf Grund der Autoboxing Funktionalität auch nicht.
 
Eine Möglichkeit z. B.
Java:
public final class Pair {
    private final double first;
    private final double second;

    public Pair(final double first, final double second) {
        this.first = first;
        this.second = second;
    }

    public double getFirst() {
        return first;
    }

    public double getSecond() {
        return second;
    }

    public Pair swap() {
        return new Pair(second, first);
    }
}
Java:
    public static void main(String[] args) {
        Pair p1 = new Pair(12, 24);
        System.out.println(p1.getFirst() + " / " + p1.getSecond());

        Pair p2 = p1.swap();
        System.out.println(p2.getFirst() + " / " + p2.getSecond());
    }

Da die Klasse immutabel ist, wird von swap() eine neue Instanz zurück gegeben. Das kann man natürlich auch ändern, indem man die beiden Instanzvariablen nicht final macht und durch die Methode swap() intern vertauscht.
 
Zuletzt bearbeitet:
Eine Möglichkeit wäre die Wrapper-Klasse Double zubenutzen. Zugriff auf den Wert in der Klasse mit doubleValue().
Grundsätzlich gilt: Wenn etwas keine set-Methode hat, kann man dessen Eigenschaften auch nicht verändern (es sei denn, die Klassenvariablen sind public, so wie in alten Java Klassen Point, Dimension usw. üblich).
Man kann sich aber natürlich selbst einen Warpper erstellen, DoubleHolder oder so.
 
Wobei die Frage ist, wie sinnvoll das ist, extra eine Wrapper Klasse mit Overhead einzuführen für das simple vertauschen von zwei Werten. Kann man machen, aber schafft meines Erachtens unnötige Komplexität.

Anders sieht es aus, wenn es nicht um 2 lokale Variablen geht, sondern z.B. um zwei Attribute einer Klasse (z.B. x und y Koordinate eines Objektes). Da könnte es sinnvoll, eine Methode
Java:
public MyPoint swap(MyPoint point) {
//...
]
zu schreiben, so wie @Termi es gerade für die Klasse swap demonstriert hat. Sprich, wenn man das Objekt schon hat, kann man sowas in eine Methode auslagern. Aber nur für die drei Zeilen swap-Code eine Wrapper Klasse einführen - ich weiß ja nicht.
 
Der Spaß geht übrigens auch ohne eine temporäre Variable...

Java:
public class Test3 {
    private double a = -3.0;
    private double b = Math.PI;

    public void swap() {
        a = Double.longBitsToDouble(Double.doubleToLongBits(a) ^ Double.doubleToLongBits(b));
        b = Double.longBitsToDouble(Double.doubleToLongBits(a) ^ Double.doubleToLongBits(b));
        a = Double.longBitsToDouble(Double.doubleToLongBits(a) ^ Double.doubleToLongBits(b));
    }

    public double getA() {
        return a;
    }

    public double getB() {
        return b;
    }

    @Override
    public String toString() {
        return "Test3{" +
                "a=" + a +
                ", b=" + b +
                '}';
    }

    public static void main(String[] args) {
        Test3 myPair = new Test3();
        System.out.println(myPair);
        myPair.swap();
        System.out.println(myPair);
        myPair.swap();
        System.out.println(myPair);
    }
}
 
In meinem Code entstehen keine Rundungsfehler. 😉

"Schön" ist es dennoch nicht, da gebe ich dir recht, dass man eine temporäre Variable dafür verschwenden sollte. 😉
 

Zurück
Oben