Aquí está la pregunta: escriba un método que intercambie dos variables. Estas dos variables deben ser primitivas. No necesita ser genérico, p. dos variables int
. ¡¿Hay alguna manera?!¿Es posible escribir el método de intercambio en Java?
Respuesta
Sin usar una matriz u objetos, no, no es posible hacerlo dentro de un método.
Por cierto, las matrices son objetos, por lo que realmente solo necesita decir objetos. de java.sun.com: "Una matriz es un objeto contenedor que contiene un número fijo de valores de un solo tipo". siendo quisquilloso, sé :) – geowa4
Entonces, ¿cómo es posible mediante el uso de matrices u objetos? ¿Estas matrices u objetos no se usan dentro de un método? ¿Son globales? ¿O puede uno intercambiar objetos dentro de un método utilizando matrices u objetos locales? – c0d3Junk13
@ geowa4 Creo que está bien decir que ambos presenten al recién llegado que la matriz es un objeto. –
revisar este artículo JavaWorld que explica en detalle:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
Un swap de dos primitivas no va a funcionar porque los primitivos se pasan por valor en Java. Ni siquiera puedes escribir un método para intercambiar dos objetos.
Como dijo @Thomas, lo único que podrías hacer es tener tus primitivos contenidos en otros objetos/matrices y modificarlos.
En java5, el más cercano que se me ocurre, lo que puede ayudar a usted, es:
La clase AtomicInteger (y otros) tienen getAndSet()
métodos atómicas ..
Como dijo Thomas Owens . Probablemente puedas hacerlo en C pasando las variables por referencia &, pero afaik no en Java sin usar objetos.
Para escribir un método de intercambio que intercambia primitivas, debe tener el concepto de variables de "salida", es decir, variables cuyos valores se pasan al contexto de llamada. C# tiene esos pero aún debe especificar que están fuera de las variables.
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);
}
}
Esta función intercambiar dos enteros
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
Si bien no es posible escribir una función que simplemente intercambia dos variables, es posible escribir una función ayudante que le permite:
- intercambiar dos variables utilizando sólo una instrucción
- Sin variables temporales en el código de la persona que llama
- Sin 'boxeo' primitivas
- Con algunas sobrecargas (uno de ellos utilizando los genéricos), funciona para cualquier tipo
Eso es como usted podría hacerlo:
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
Esto funciona porque las garantías del lenguaje Java (Java la Especificación del idioma, Java SE 7 Edition, sección 15.12.4.2) que todos los argumentos se evalúan de izquierda a derecha (a diferencia de otros idiomas, en el que el orden de evaluación no está definido), por lo que el orden de ejecución es:
- El valor original de
b
se evalúa con el fin de ser pasado como el primer argumento de la función - la expresión
b = a
se evalúa, y el resultado (el nuevo valor deb
) se pasa como el segundo argumento de la función - la función ejecuta, devolviendo el valor original de
b
e ignorando su nuevo valor - Usted assi gn el resultado de
a
Si returnFirst
es demasiado largo, se puede elegir un nombre más corto para hacer el código más compacto (por ejemplo, a = sw(b, b = a)
). Usar esto para impresionar a sus amigos y confundir a sus enemigos :-)
Si nombra su función '_', entonces ** puede ** escribir **' a = b; b = a; '**. Vea qué tan limpio (?) Parece: ** 'a = _ (b, b = a);' ** – marcus
Ouch, _ está desaprobado como identificador en Java 8 y podría eliminarse en Java 9. No estoy seguro de qué van a usarlo para. – marcus
esto es horrible e ilegible, ¿quién querrá hacer esto? – maazza
Se puede hacer una versión genérica del método de intercambio de @ Marcus que intercambie cualquier número de objetos del mismo tipo:
<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);
Una función vararg creará una matriz temporal (Objeto []) para pasar todos los objetos. No estoy seguro de cómo se comportará el JIT en tiempo de ejecución, pero crear una matriz para intercambiar dos valores parece un poco desperdiciado, a menos que realmente necesite una función 'rotar' para un número no especificado de objetos. – marcus
Para un número fijo de valores, puede hacerlo [sin el conjunto] (http: // stackoverflow.com/questions/2393906/how-do-i-make-my-swap-function-in-java/20600020 # 20600020). – dansalmo
He aquí un método que operaciones de permuta financiera dos variables primitivas
private void swap(){
int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;
}
puede que no sea de mucha utilidad sin embargo;)
Ok serio, se podría hacer si las variables son el nivel de clase:
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;
}
}
Otra vez sin embargo, no llego a ver lo que el uso de esto podría ser
Esto respondió a la pregunta tal como está escrita: ¿por qué el voto a favor? – wonderer
Sí, es posible intercambiar dos variables utilizando un método. Pero debe declarar ese método con paréntesis vacíos y luego llamarlo por referencia (paréntesis vacíos). Aquí hay un ejemplo que ilustra el intercambio de dos variables usando un método.
clase pública Intercambio
{
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);
}
}
Al compilar el código por encima de la salida se presenta como sigue:
antes de intercambiar
A = Manzana
B = Bat
Después de cambiar
A = Bat
B = Manzana
// En caso de llamadas por referencia valor original se cambia si hacemos cambios en el método llamado
Este es un método que intercambia los valores de dos variables en una clase, no dos variables pasadas como parámetros. Y llamar a un método sin parámetros NO es llamar a un método por referencia. –
He leído las respuestas anteriores en busca de una explicación de por qué se dice que un programa de intercambio no se puede escribir en Java en la forma en que está escrito en C++. lo hice de la siguiente manera program screenshot
de una sola línea para cualquier número primitivos:
a += (b - (b = a));
- 1. Método seguro para actualizar paquetes R: ¿es posible el intercambio en caliente?
- 2. ¿Es posible leer/escribir bits de un archivo usando JAVA?
- 3. ¿Es posible escribir código para escribir código?
- 4. Java: ¿Por qué este método de intercambio no funciona?
- 5. ¿Es posible escribir sintaxis como -()()?
- 6. ¿Qué es el intercambio implícito?
- 7. ¿Es posible escribir extensiones en el depurador de Delphi?
- 8. ¿Es posible escribir aplicaciones de consola en el esquema?
- 9. ¿Es posible escribir un firewall en python?
- 10. ¿Es posible escribir datos en el propio stdin en Linux
- 11. ¿Es posible escribir frases sencillas en Python?
- 12. ¿Hay un método de intercambio genérico en el marco?
- 13. ¿Por qué no es bueno escribir en el campo estático del método de instancia en Java?
- 14. ¿Es posible escribir un cliente de Skype?
- 15. ¿Es posible el parche de mono en Java?
- 16. Intercambio de variables dentro del método estático
- 17. ¿Es posible DirectX en Java?
- 18. ¿Es posible obtener el método de referencia en VB.NET?
- 19. Java Antivirus ... ¿es posible? ¿Cómo?
- 20. es posible sobrecargar un método final
- 21. Posible escribir el código Protovis en CoffeeScript?
- 22. ¿Es posible escribir texto en richtextbox en tiempo de diseño?
- 23. ¿Es posible escribir código PHP estrictamente tipado?
- 24. cómo escribir un método de Igualdad en Java
- 25. ¿Es catch un método en java?
- 26. ¿Es posible animar el método BringIntoView en WPF?
- 27. ¿Es posible visualizar imágenes con el método loadDataWithBaseURL() en android?
- 28. ¿Qué es "String args []"? parámetro en el método principal Java
- 29. ¿Es posible crear el método call dispatcher en C++?
- 30. ¿Es posible escribir entidades de tipo genérico en VHDL?
Chk esta información out.More de intercambio por referencia. http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html Chk esto. Más información sobre el intercambio por referencia. –