2009-09-01 9 views
44

Voici la question: écrivez une méthode qui permute deux variables. Ces deux variables doivent être des primitives. Il n'a pas besoin d'être générique, par ex. deux variables int. Y a-t-il un moyen ?!Est-il possible d'écrire une méthode d'échange en Java?

+0

Chk cette info out.More SWAP par référence. http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html Chk this out.Plus d'informations sur l'échange par référence. –

Répondre

43

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

+2

btw, les tableaux sont des objets, vous n'avez donc vraiment besoin de dire que des objets. from java.sun.com: "Un tableau est un objet conteneur qui contient un nombre fixe de valeurs d'un seul type." être difficile je sais :) – geowa4

+0

Alors, comment est-ce possible en utilisant des tableaux ou des objets? Ces tableaux ou objets ne sont-ils pas utilisés dans une méthode? Sont-ils globaux? Ou peut-on échanger des objets à l'intérieur d'une méthode en utilisant des tableaux ou des objets locaux? – c0d3Junk13

+0

@ geowa4 Je pense qu'il est correct de dire à la fois pour présenter au nouveau venu que le tableau est un objet. –

18

Vérifiez cette article JavaWorld qu'il explique en détail:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Un échange de deux primitives ne marchera jamais parce que primitives sont passés par valeur en Java. Vous ne pouvez même pas écrire une méthode pour échanger deux objets d'ailleurs. Comme @Thomas l'a dit, la seule chose que vous pourriez faire est d'avoir vos primitives contenues dans d'autres objets/tableaux et de les modifier.

2

En java5, le plus proche, je peux penser, ce qui peut vous aider, est la suivante:

La classe AtomicInteger (et d'autres) ont getAndSet() méthodes atomiques ..

+0

La question concerne spécifiquement les types primitifs. Ce sont des objets. –

+0

@Thomas: "** devrait ** être primitive" – geowa4

+0

@Thomas OK. Je n'ai pas la moindre idée alors. @ geowa4 Merci pour votre soutien :-) – KLE

0

Comme Thomas Owens dit . Vous pourriez probablement le faire en C en passant des variables par référence &, mais pas en Java sans utiliser d'objets.

2

Pour écrire une méthode d'échange qui permute les primitives, vous devez avoir le concept de variables «sortantes», c'est-à-dire des variables dont les valeurs sont transmises au contexte appelant. C# a ceux-ci mais vous devez toujours spécifier qu'ils sont des variables en dehors.

-4
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); 
    }  
} 
1

Cette fonction échangera deux ints

Integer[] swap(int a, int b){ 
    return new Integer[]{b,a}; 
} 
44

Bien qu'il soit possible d'écrire une fonction qui intervertit simplement deux variables, il est possible d'écrire une fonction d'assistance qui vous permet de:

  • Swap deux variables à l'aide une seule instruction
  • Sans variables temporaires dans le code de l'appelant
  • sans 'boxe' primitives
  • Avec quelques surcharges (l'un d'entre eux à l'aide de médicaments génériques), il fonctionne pour tout type

Voilà 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 La Spécification nguage, 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 est non défini), de sorte que l'ordre d'exécution est:

  1. La valeur d'origine de b est évaluée afin d'être passé comme le premier argument de la fonction
  2. l'expression b = a est évalué, et le résultat (la nouvelle valeur de b) est transmise en tant que second argument de la fonction
  3. la fonction exécute, renvoyant la valeur originale de b et en ignorant sa nouvelle valeur
  4. Vous assi gn le résultat à a

Si returnFirst est trop long, vous pouvez choisir un nom plus court pour rendre plus compact code (par exemple a = sw(b, b = a)). Utilisez cette option pour impressionner vos amis et confondre vos ennemis :-)

+1

Si vous nommez votre fonction '_', alors vous pouvez ** presque ** écrire **' a = b; b = a; '**. Voir comment clean (?) Il ressemble: ** 'a = _ (b, b = a);' ** – marcus

+2

Ouch, _ est déprécié comme un identifiant dans Java 8 et pourrait être supprimé dans Java 9. Pas sûr de ce qu'ils vont l'utiliser pour. – marcus

+0

c'est horrible et illisible, qui voudra faire ça? – maazza

3

Vous pouvez faire une version générique de la méthode d'échange de @ marcus qui échange un certain 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); 
+0

Une fonction vararg va créer un tableau temporaire (Object []) pour passer tous les objets. Je ne suis pas sûr de la façon dont le JIT va se comporter à l'exécution, mais créer un tableau pour échanger deux valeurs semble un peu inutile, sauf si vous avez vraiment besoin d'une fonction 'rotate' pour un nombre indéterminé d'objets. – marcus

+0

Pour un nombre fixe de valeurs, vous pouvez le faire [sans le tableau] (http: // stackoverflow.com/questions/2393906/comment-faire-je-faire-ma-swap-fonction-en-java/20600020 # 20600020). – dansalmo

1

Voici une méthode swaps 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é si;)

Ok sérieusement, il pourrait se faire que si les variables sont le niveau de 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

+0

Cela a répondu à la question écrite - pourquoi la downvote? – wonderer

-1

Oui, il est possible d'échanger deux à l'aide d'une méthode variable. Mais vous devez déclarer cette méthode avec des parenthèses vides, puis l'appeler par référence (parenthèses vides). Voici un exemple illustrant l'échange de deux variables à l'aide d'une méthode.

public class Permutation

{

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 se présente comme suit:

Avant permutation

A = Pomme

B = Bat

Après avoir échangé

A = Bat

B = Pomme

// En cas d'appel par référence valeur initiale est modifiée si nous avons fait des changements dans la méthode appelée

+0

Il s'agit d'une méthode qui permute les valeurs de deux variables dans une classe, et non deux variables passées en tant que paramètres. Et l'appel d'une méthode sans paramètre n'appelle PAS une méthode par référence. –

1

J'ai lu les réponses ci-dessus cherchant une explication sur la raison pour laquelle il est dit qu'un programme de permutation ne peut pas être écrit en Java comme il est écrit en C++. j'ai fait de la façon suivante program screenshot

3

one-liner pour les numéros primitifs:

a += (b - (b = a)); 
Questions connexes