54 votes

Est-il possible d'écrire une méthode d'échange en Java?

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?!

59voto

marcus Points 1244

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:

  1. La valeur d'origine de l' b est évalué afin d'être passé comme premier argument de la fonction
  2. L'expression b = a est évaluée et le résultat (la nouvelle valeur de b) est passé comme deuxième argument de la fonction
  3. La fonction s'exécute, de retourner à la valeur originale d' b , et en ignorant sa nouvelle valeur
  4. 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 :-)

50voto

Thomas Owens Points 45042

Sans utiliser un tableau ou des objets, non, il n'est pas possible de le faire dans une méthode.

18voto

Brent Nash Points 6337

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.

2voto

KLE Points 11711

En java5, le plus proche auquel je puisse penser et qui peut vous aider est le suivant:

La classe AtomicInteger (et les autres) a getAndSet() méthodes atomiques.

2voto

Michael Wiles Points 7570

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X