web-dev-qa-db-fra.com

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 que ce soit générique, par exemple. deux variables int. Y a-t-il un moyen?!

49
AraK

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

45
Thomas Owens

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:

  • Échangez deux variables en utilisant une seule instruction
  • Sans variables temporaires dans le code de l'appelant
  • Sans 'boxe' primitives
  • Avec quelques surcharges (l’un d’eux utilisant des génériques), cela fonctionne pour n’importe quel type

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:

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

48
marcus

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.

18
Brent Writes Code

Une ligne pour tous les nombres primitifs:

a += (b - (b = a));
5
Oleg Mikhailov

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);
3
dansalmo

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().

2
KLE

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.

2
Michael Wiles

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

1
Rohan Dwivedi

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

1
wonderer

Cette fonction va échanger deux ints

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}
1
Fadi Hatem

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.

0
Chris Holland