Hier ist die Frage: Schreiben Sie eine Methode, die zwei Variablen vertauscht. Diese zwei Variablen sollten Primitive sein. Es muss nicht generisch sein, z.B. zwei int
Variablen. Gibt es einen Weg?!Kann die Swap-Methode in Java geschrieben werden?
Antwort
Ohne ein Array oder Objekte, nein, ist es nicht möglich, es innerhalb einer Methode zu tun.
Btw, Arrays sind Objekte, so dass man wirklich nur Objekte sagen musste. from java.sun.com: "Ein Array ist ein Containerobjekt, das eine feste Anzahl von Werten eines einzelnen Typs enthält." wählerisch zu sein, weiß ich :) – geowa4
Also wie ist es möglich, Arrays oder Objekte zu verwenden? Werden diese Arrays oder Objekte nicht in einer Methode verwendet? Sind sie global? Oder kann man Objekte innerhalb einer Methode mit lokalen Arrays oder Objekten austauschen? – c0d3Junk13
@ geowa4 Ich denke, es ist in Ordnung zu sagen, dass sowohl Array als auch Objekt ein neues Objekt sind. –
Schauen Sie sich diese Javaworld Artikel, der es im Detail erklärt:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
Ein Tausch von zwei Primitiven wird nie funktionieren, weil Primitiven von Wert in Java übergeben werden. Sie können nicht einmal eine Methode schreiben, um zwei Objekte zu tauschen.
Wie @Thomas sagte, das einzige, was Sie tun könnten, ist Ihre Primitiven in anderen Objekten/Arrays enthalten und diese zu ändern.
In java5, in der Nähe ich denken kann, die Ihnen helfen können, ist:
Die Klasse Atomicinteger (und andere) haben getAndSet()
Atom Methoden ..
Als Thomas Owens sagte . Sie könnten es wahrscheinlich in C tun, indem Sie Variablen durch & Referenz übergeben, aber afaik nicht in Java, ohne Objekte zu verwenden.
Um eine Swap-Methode zu schreiben, die Grundelemente vertauscht, 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 immer noch angeben, dass sie keine Variablen sind.
public class Swap
{
public static void main (String[]args)
{
int y = 5;
int x = 4;
int c;
System.out.println("y = "+y);
System.out.println("x = "+x);
c=x; //c = 4
x=y; //x = 5;
y=c;
System.out.println("\n");
System.out.println("y= "+y);
System.out.println("x= "+x);
}
}
Diese Funktion zwei Ints
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
tauschen wird Während es nicht möglich ist, eine Funktion zu schreiben, die zwei Variablen einfach austauscht, ist es möglich, eine Helferfunktion, die können Sie schreiben:
- Swap zwei Variablen nur eine Anweisung mit
- Ohne temporäre Variablen im Code des Anrufers
- Ohne ‚Boxen‘ Primitiven
- Mit wenigen Überlastungen (eines davon mit Generika) arbeitet es für jede Art
Das ist, wie Sie könnten es tun:
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 garantiert (Java La Spezifikation, Java SE 7 Edition, Abschnitt 15.12.4.2), dass alle Argumente werden von links nach rechts (im Gegensatz zu einigen anderen Sprachen ausgewertet, wobei die Reihenfolge der Auswertung ist nicht definiert), so dass die Ausführungsreihenfolge ist:
- Der ursprüngliche Wert von
b
wird ausgewertet, um zu übergeben wird als erstes Argument für die Funktion - der Ausdruck
b = a
wird ausgewertet, und das Ergebnis (der neue Wert vonb
) wird als das zweite Argument der Funktion übergibt - die Funktion ausführt, um den ursprünglichen Wert von
b
Rückkehr und ignorieren sein neuer Wert - Sie assi gn das Ergebnis zu
a
Wenn returnFirst
zu lang ist, können Sie einen kürzeren Namen wählen, um Code kompakter zu machen (z a = sw(b, b = a)
). Verwenden Sie diese Ihre Freunde zu beeindrucken und verwirren Sie Ihre Feinde :-)
Wenn du deine Funktion '_' benennst, kannst du ** fast ** schreiben **' a = b; b = a; '**. Sehen Sie, wie sauber (?) Es aussieht: ** 'a = _ (b, b = a); '** – marcus
Autsch, _ ist als Bezeichner in Java 8 veraltet und konnte in Java 9 entfernt werden. Nicht sicher, was sie tun werde es für verwenden. – marcus
das ist schrecklich und unlesbar, wer will das machen? – maazza
Sie können eine generische Version von @ marcus des Swap-Methode machen, die eine beliebige Anzahl von Objekten des gleichen Typs Swaps:
<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);
Eine Vararg-Funktion erstellt ein temporäres Array (Object []), um alle Objekte zu übergeben. Ich bin mir nicht sicher, wie sich das JIT zur Laufzeit verhält, aber ein Array zu erstellen, das zwei Werte vertauscht, sieht etwas verschwenderisch aus, es sei denn, Sie benötigen wirklich eine Rotationsfunktion für eine unbestimmte Anzahl von Objekten. – marcus
Für eine feste Anzahl von Werten können Sie dies tun [ohne das Array] (http: // stackoverflow.com/questions/2393906/how-do-ich-mache-meine-swap-function-in-java/20600020 # 20600020). – dansalmo
Hier ist eine Methode, die Swaps zwei primitive Variablen
private void swap(){
int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;
}
es ist nicht jedoch von großem nutzen sein könnte;)
Ok ernst, es könnte geschehen, wenn die Variablen Klassenstufe 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 obwohl, sehe ich nicht, was die Verwendung dieses
könnteDies beantwortet die Frage wie geschrieben - warum der Downvote? – wonderer
Ja, es ist möglich, zwei Variable unter Verwendung eines Verfahrens zu tauschen. Aber Sie sollten diese Methode mit leeren Klammern deklarieren und rufen Sie dann durch Referenz (leere Klammern). Hier ist ein Beispiel, das den Austausch von zwei Variablen mit einer Methode veranschaulicht.
public class Swapping
{
static String A="Apple";
static String B="Bat";
public static void swap()
{
String k;
k=A;
A=B;
B=k;
}
public static void main(String[] args)
{
System.out.println("Before swapping");
System.out.println("A= "+A);
System.out.println("B= "+B);
swap();
System.out.println("After swapping");
System.out.println("A= "+A);
System.out.println("B= "+B);
}
}
Durch den obigen Code Kompilieren der Ausgang kommt wie folgt:
Vor
A = Apple-
SwappingB = Bat
Nach dem Vertauschen
A = Bat
B = Apple-
// Bei Aufruf von Original-Referenzwert geändert wird, wenn wir Änderungen in der aufgerufenen Methode hergestellt
Dies ist eine Methode, die die Werte von zwei Variablen in einer Klasse vertauscht, nicht zwei Variablen, die als Parameter übergeben werden. Und das Aufrufen einer Methode ohne Parameter ruft keine Methode als Referenz auf. –
Ich habe die obigen Antworten gelesen, die eine Erklärung suchen, warum es heißt, dass ein Swapping-Programm nicht in Java geschrieben werden kann, wie es in C++ geschrieben ist. Ich habe die folgende Art und Weise program screenshot
One-Liner für alle primitiven Zahlen:
a += (b - (b = a));
Chk dieser out.More Informationen über Swap Bezug genommen wird. http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html Chk this out.Weitere Informationen über den Austausch per Referenz. –