Est-il possible d'écrire la méthode swap en Java? [dupliquer]
cette question a déjà une réponse ici:
Voici la question: écrivez une méthode qui échange deux variables. Ces deux variables devraient être primitives. Il n'a pas besoin d'être générique, par exemple deux int
variables. Est-il possible?!
13 réponses
sans utiliser un tableau ou des objets, non, il n'est pas possible de le faire dans une méthode.
bien qu'il ne soit pas possible d'écrire une fonction qui change simplement deux variables, il est possible d'écrire une helper function qui vous permet de:
- Swap deux variables utilisant un seul énoncé
- Sans variables temporaires dans le code de l'appelant
- sans "boxe " primitives
- avec quelques surcharges (l'un d'eux utilisant des génériques), il fonctionne pour tout type
C'est comment vous pouvez le faire:
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
cela fonctionne parce que le langage Java garantit (Java Language Specification, Java SE 7 Edition, section 15.12.4.2) que tous les arguments sont évalués de gauche à droite (contrairement à d'autres langues, où l'ordre d'évaluation n'est pas défini), de sorte que l'ordre d'exécution est:
- la valeur originale de
b
est évaluée afin d'être transmise comme premier argument à la fonction - l'expression
b = a
est évaluée, et le résultat (la nouvelle valeur deb
) est passé comme second argument à la fonction - la fonction s'exécute, retournant la valeur originale de
b
et ignorant sa nouvelle valeur - vous assignez le résultat à
a
si returnFirst
est trop long, vous pouvez choisir un nom plus court pour rendre le code plus compact (par exemple a = sw(b, b = a)
). Utilisez ceci pour impressionner vos amis et confondre vos ennemis: -)
découvrez cet article de JavaWorld qui l'explique en détail:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
un échange de deux primitives ne fonctionnera jamais parce que les primitives sont passées par valeur en Java. Vous ne pouvez même pas écrire une méthode pour échanger deux objets.
comme @Thomas l'a dit, la seule chose que vous pouvez faire est d'avoir vos primitives contenues dans autres objets/tableaux et les modifier.
One-liner pour toute primitive nombres:
a += (b - (b = a));
vous pouvez faire une version générique de la méthode d'échange de @marcus qui échange n'importe quel nombre d'objets du même type:
<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);
en java5, le plus proche que je peux penser, qui peut vous aider, est:
la classe AtomicInteger (et autres) ont getAndSet()
méthodes atomiques ..
pour écrire une méthode de swap qui échange des primitives, vous devez avoir le concept de variables" out", c'est-à-dire des variables dont les valeurs sont passées au contexte appelant. C# possède ces variables, mais vous devez tout de même préciser qu'elles ne sont pas des variables.
cette fonction échangera deux ints
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
Voici une méthode qui échange deux variables primitives
private void swap(){
int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;
}
Il pourrait ne pas être d'une grande utilité ;)
OK sérieusement, cela pourrait être fait si les variables sont au niveau de la classe:
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;
}
}
encore une fois, cependant, je ne vois pas ce que l'utilisation de ce pourrait être
j'ai lu les réponses ci-dessus pour savoir pourquoi on dit qu'un programme d'échange ne peut pas être écrit en java comme il est écrit en c++. J'ai fait de la façon suivante capture d'écran du programme
comme disait Thomas Owens. Vous pouvez probablement le faire en C en passant des variables par &reference, mais pas en Java sans utiliser des objets.
Oui il est possible de changer deux variables en utilisant une méthode. mais vous devriez déclarer cette méthode avec des parenthèses vides et ensuite l'appeler par référence (entre parenthèses vides) . Voici un exemple qui illustre la permutation de deux variables à l'aide d'une méthode.
échange de classe publique
{
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);
}
}
en compilant le code ci-dessus la sortie vient comme suit:
avant d'échanger
A = Apple
B= Chauve-Souris
après échange
A= Chauve-Souris
B= Pomme
/ / en cas d'appel par référence, la valeur originale est modifiée si nous apportons des modifications à la méthode appelée
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);
}
}