it-swarm.com.de

Kann man eine Swap-Methode in Java schreiben?

Hier ist die Frage: Schreiben Sie eine Methode, die zwei Variablen vertauscht. Diese beiden Variablen sollten Grundelemente sein. Es muss nicht generisch sein, z. zwei int-Variablen. Gibt es einen Weg?!

49
AraK

Ohne die Verwendung eines Arrays oder von Objekten ist es nicht möglich, dies innerhalb einer Methode auszuführen.

45
Thomas Owens

Es ist zwar nicht möglich, eine Funktion zu schreiben, die einfach zwei Variablen vertauscht, aber es ist möglich, eine helper-Funktion zu schreiben, mit der Sie:

  • Tausche zwei Variablen mit nur einer Anweisung
  • Ohne temporäre Variablen im Code des Aufrufers
  • Ohne "Boxen" Primitive
  • Mit ein paar Überladungen (eine davon mit Generics), funktioniert für jeden Typ

So kannst du es machen:

int returnFirst(int x, int y) {
    return x;
}
int a = 8, b = 3;
a = returnFirst(b, b = a); // try reading this as a = b; b = a;
System.out.println("a: " + a + ", b: " + b); // prints a: 3, b: 8

Dies funktioniert, weil die Java-Sprache (Java-Sprachspezifikation, Java SE 7 Edition, Abschnitt 15.12.4.2) garantiert, dass alle Argumente von links nach rechts ausgewertet werden (im Gegensatz zu anderen Sprachen, bei denen die Reihenfolge der Auswertung undefiniert ist), also der Ausführungsreihenfolge ist:

  1. Der ursprüngliche Wert von b wird ausgewertet, um als erstes Argument an die Funktion übergeben zu werden
  2. Der Ausdruck b = a wird ausgewertet und das Ergebnis (der neue Wert von b) wird als zweites Argument an die Funktion übergeben
  3. Die Funktion führt den ursprünglichen Wert von b aus und ignoriert den neuen Wert
  4. Sie weisen das Ergebnis a zu.

Wenn returnFirst zu lang ist, können Sie einen kürzeren Namen wählen, um den Code kompakter zu gestalten (z. B. a = sw(b, b = a)). Benutze dies, um deine Freunde zu beeindrucken und deine Feinde zu verwirren :-)

48
marcus

In diesem JavaWorld-Artikel finden Sie ausführliche Informationen dazu:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Ein Austausch von zwei Grundelementen wird niemals funktionieren, da Grundelemente in Java als Wert übergeben werden. Sie können nicht einmal eine Methode schreiben, um zwei Objekte für diese Angelegenheit auszutauschen. 

Wie bei @Thomas gesagt, besteht die einzige Möglichkeit darin, dass Ihre Grundelemente in anderen Objekten/Arrays enthalten sind und diese ändern.

18

Einzeiler für alle primitiven Zahlen:

a += (b - (b = a));
5
Oleg Mikhailov

Sie können eine generische Version der @ marcus-Swap-Methode erstellen, die eine beliebige Anzahl von Objekten desselben Typs austauscht:

<T> T swap(T... args) {   // usage: z = swap(a, a=b, b=c, ... y=z);
    return args[0];
}

b = swap(a, a=b);
z = swap(x, x=y, y=z);
3
dansalmo

In Java5 kann ich mir am besten vorstellen, was Ihnen helfen kann:

Die AtomicInteger-Klasse (und andere) haben getAndSet() atomare Methoden.

2
KLE

Um eine Swap-Methode zu schreiben, die Grundelemente austauscht, müssten Sie das Konzept von "out" -Variablen haben, d. H. Variablen, deren Werte an den aufrufenden Kontext übergeben werden. C # hat diese, aber Sie müssen noch angeben, dass es sich um Out-Variablen handelt.

2
Michael Wiles

Ich habe die obigen Antworten gelesen und nach einer Erklärung gesucht, warum gesagt wird, dass ein Austauschprogramm nicht in Java geschrieben werden kann, wie es in c ++ ..__ geschrieben ist. Ich habe den folgenden Weg gemacht Programm Screenshot

1
Rohan Dwivedi

Hier ist eine Methode, die zwei primitive Variablen austauscht

private void swap(){
    int a = 1;
    int b = 2;
    int temp = a;
    a = b;
    b = temp;
}

Es könnte aber nicht viel nützen;)

Ok, im Ernst, es könnte gemacht werden, wenn die Variablen Klassenebene sind:

public class MyClass{
    // excuse horrible coding practice of public mutable fields
    public int a = 1;
    public int b = 2;

    public void swap(){
        int temp = a;
        a = b;
        b = temp;
    }
}

Wieder kann ich jedoch nicht erkennen, wie dies genutzt werden könnte

1
wonderer

Diese Funktion tauscht zwei Ints aus

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}
1
Fadi Hatem

Wie Thomas Owens sagte. Sie könnten dies wahrscheinlich in C tun, indem Sie Variablen durch & reference übergeben, aber afaik nicht in Java ohne Objekte.

0
Chris Holland