Voici la question: écrivez une méthode qui permute deux variables. Ces deux variables doivent être des primitives. Il n'est pas nécessaire qu'il soit générique, par exemple deux variables int
. Y a-t-il un moyen?!
Réponses
Trop de publicités?Alors qu'il n'est pas possible d'écrire une fonction qui, tout simplement, des swaps de deux variables, il est possible d'écrire une fonction d'assistance qui vous permet de:
- Permuter deux variables à l'aide d' une seule instruction
- Sans variables temporaires dans le code de l'appelant
- Sans 'boxe' primitives
- Avec un peu de surcharges (l'un d'entre eux à l'aide de médicaments génériques), il fonctionne pour tout type de
C'est la façon dont vous pourriez 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 garanties (Java Language Specification, Java SE 7 Édition, section 15.12.4.2) que tous les arguments sont évalués de gauche à droite (contrairement à certains autres langues, où l'ordre d'évaluation n'est pas défini), de sorte que l'ordre d'exécution est:
- La valeur d'origine de l'
b
est évalué afin d'être passé comme premier argument de la fonction - L'expression
b = a
est évaluée et le résultat (la nouvelle valeur deb
) est passé comme deuxième argument de la fonction - La fonction s'exécute, de retourner à la valeur originale d'
b
, et en ignorant sa nouvelle valeur - Vous assing le résultat d'
a
Si returnFirst
est trop long, vous pouvez choisir un nom plus court pour rendre le code plus compact (par exemple, a = _(b, b = a)
). L'utiliser pour impressionner vos amis et de confondre vos ennemis :-)
Découvrez ce JavaWorld article qui explique en détail:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
Un swap de deux primitives ne marchera jamais parce que les primitives sont passés par valeur en Java. Vous ne pouvez même pas écrire une méthode pour échanger deux objets qui que ce soit.
Comme @Thomas a dit, la seule chose que vous pourriez faire est d'avoir votre primitives contenues dans d'autres objets/des tableaux et modifier ceux-ci.