Voici la question: écrivez une méthode qui permute deux variables. Ces deux variables doivent être des primitives. Il n'est pas nécessaire que ce soit générique, par exemple. deux variables int
. Y a-t-il un moyen?!
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 permute simplement deux variables, il est possible d'écrire un helper function qui vous permet de:
C'est comme ça que vous pourriez 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 car le langage Java garantit (spécification du langage Java, édition 7 de Java SE 7, paragraphe 15.12.4.2) que tous les arguments sont évalués de gauche à droite (contrairement à certains autres langages, où l’évaluation n’est pas définie), de sorte que est:
b
est évaluée afin d'être passée en tant que premier argument à la fonctionb = a
est évaluée et le résultat (la nouvelle valeur de b
) est passé en tant que deuxième argument de la fonction.b
et en ignorant sa nouvelle valeur.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 :-)
Consultez cet article 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 car les primitives sont passées valeur par valeur en Java. Vous ne pouvez même pas écrire une méthode pour échanger deux objets pour cette question.
Comme @Thomas l'a dit, la seule chose que vous puissiez faire est de contenir vos primitives dans d'autres objets/tableaux et de les modifier.
Une ligne pour tous les nombres primitifs:
a += (b - (b = a));
Vous pouvez créer une version générique de la méthode swap de @ marcus qui permute un nombre illimité 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 auquel je puisse penser, et qui peut vous aider, est le suivant:
La classe AtomicInteger (et les autres) ont des méthodes atomiques getAndSet()
.
Pour écrire une méthode de swap échangeant des primitives, vous devez utiliser le concept de variable "out", c’est-à-dire des variables dont les valeurs sont transmises au contexte d’appel. C # a ceux-ci mais vous devez toujours spécifier qu'ils sont des variables.
J'ai lu les réponses ci-dessus en cherchant une explication sur la raison pour laquelle il est dit qu'un programme d'échange ne peut pas être écrit en Java de la manière dont il est écrit en c ++ . J'ai fait le chemin suivant capture d'écran du programme
Voici une méthode qui permute deux variables primitives
private void swap(){
int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;
}
Cela pourrait ne pas être très utile cependant;)
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 ceci pourrait être
Cette fonction va échanger deux ints
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
Comme l'a dit Thomas Owens. Vous pouvez probablement le faire en C en passant des variables par référence, mais peut-être pas en Java sans utiliser d'objets.