Est-il possible d'écrire la méthode swap en Java? [dupliquer]

cette question a déjà une réponse ici:

  • Comment écrire un swap de base de la fonction en Java [dupliquer] 19 réponses

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

48
demandé sur AraK 2009-09-01 19:42:02

13 réponses

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

45
répondu Thomas Owens 2009-09-01 15:44:20

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:

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

46
répondu marcus 2015-02-28 00:01:47

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.

18
répondu Brent Writes Code 2009-09-01 15:48:18

One-liner pour toute primitive nombres:

a += (b - (b = a));
5
répondu Oleg Mikhailov 2016-05-17 13:24:30

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);
3
répondu dansalmo 2013-12-16 00:34:51

en java5, le plus proche que je peux penser, qui peut vous aider, est:

la classe AtomicInteger (et autres) ont getAndSet() méthodes atomiques ..

2
répondu KLE 2009-09-01 15:48:59

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.

2
répondu Michael Wiles 2009-09-01 15:53:10

cette fonction échangera deux ints

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}
1
répondu Fadi Hatem 2013-05-09 13:56:18

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

1
répondu wonderer 2014-03-04 12:05:56

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

1
répondu Rohan Dwivedi 2016-01-18 10:16:42

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.

0
répondu Chris Holland 2009-09-01 15:51:16

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

-1
répondu Bobby Brahmam 2015-10-01 15:12:38
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);
    }    
}
-4
répondu Victor 2012-10-15 17:27:53