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?
 

Jw456

Top Contributor
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:

Jw456

Top Contributor
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.
 

LimDul

Top Contributor
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;
 
K

kneitzel

Gast
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.
 

temi

Top Contributor
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:

Neumi5694

Top Contributor
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.
 

LimDul

Top Contributor
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.
 

EinNickname9

Bekanntes Mitglied
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);
    }
}
 

EinNickname9

Bekanntes Mitglied
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. ;)
 

Ähnliche Java Themen

Neue Themen


Oben