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?
Répondre
Sans utiliser un tableau ou des objets, non, il n'est pas possible de le faire dans une méthode.
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
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
@ geowa4 Je pense qu'il est correct de dire à la fois pour présenter au nouveau venu que le tableau est un objet. –
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.
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 ..
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.
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.
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);
}
}
Cette fonction échangera deux ints
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
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:
- La valeur d'origine de
b
est évaluée afin d'être passé comme le premier argument de la fonction - l'expression
b = a
est évalué, et le résultat (la nouvelle valeur deb
) est transmise en tant que second argument de la fonction - la fonction exécute, renvoyant la valeur originale de
b
et en ignorant sa nouvelle valeur - 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 :-)
Si vous nommez votre fonction '_', alors vous pouvez ** presque ** écrire **' a = b; b = a; '**. Voir comment clean (?) Il ressemble: ** 'a = _ (b, b = a);' ** – marcus
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
c'est horrible et illisible, qui voudra faire ça? – maazza
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);
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
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
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
Cela a répondu à la question écrite - pourquoi la downvote? – wonderer
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
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. –
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
one-liner pour les numéros primitifs:
a += (b - (b = a));
- 1. Comment décrire une fonction locale à (trace)?
- 2. Comment décrire un UIElement en Partial-Trust?
- 3. Comment remplacer une méthode java de groovy
- 4. méthode générique en Java, déterminer le type
- 5. est-il possible d'avoir une communication InterProcess en Java?
- 6. une des classes de méthode avec ENUM en java
- 7. Java n'a pas une méthode listDirectories/listFiles, une bibliothèque native?
- 8. La méthode HashMap est surchargée en Java
- 9. Est-il possible d'envoyer une méthode d'objet à une fonction?
- 10. invoquant une méthode PHP de Java
- 11. Est-il possible de nommer une variable en utilisant une variable en Java?
- 12. Est-il possible de déclarer une méthode en tant que paramètre en C#?
- 13. Un XSD pour décrire des XSD
- 14. Est-ce possible de faire avec des images en java?
- 15. Est-il possible de créer une instance et une méthode d'appel en une commande (sur la même ligne) en PHP?
- 16. Interaction Java/C# Kerberos possible?
- 17. Réorganiser automatiquement une boucle en une méthode récursive?
- 18. Quitter une méthode en C#
- 19. En Python, est-il possible d'accéder à la classe qui contient une méthode, donnée seulement un objet méthode?
- 20. Décrire un chemin avec GDI + dans .Net
- 21. Est-il possible d'utiliser une méthode d'extension dans un bloc d'initialisation d'objet en C#
- 22. Est-il possible de renvoyer une classe dérivée d'une méthode de classe de base en C++?
- 23. Est-il possible d'obtenir la méthode de nom de cela appelle une autre méthode?
- 24. Est-il possible d'appeler une méthode sur le type que vous transmettez dans votre méthode générique?
- 25. décrire requête avec oracle (.Net Connector)
- 26. Pourquoi pouvez-vous réfléchir et appeler une méthode (pas si) privée en Java et .Net
- 27. Comment décrire un service Web ASP.NET ENUM pour JSR-172 (Java ME) Consommation
- 28. eclipse beakpoint: arrête avant de quitter une méthode Java
- 29. Méthode pour substituer l'étranger pour les caractères anglais en Java?
- 30. Regex qui correspond à une déclaration de méthode Java
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. –