2009-09-01 24 views
44

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?

+0

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. –

Respuesta

43

Sin usar una matriz u objetos, no, no es posible hacerlo dentro de un método.

+2

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

+0

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

+0

@ geowa4 Creo que está bien decir que ambos presenten al recién llegado que la matriz es un objeto. –

18

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.

2

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

+0

La pregunta es específicamente sobre tipos primitivos. Estos son objetos. –

+0

@Thomas: "** debe ** ser primitivo" – geowa4

+0

@Thomas OK. No tengo ni idea entonces. @ geowa4 Gracias por su apoyo :-) – KLE

0

Como dijo Thomas Owens . Probablemente puedas hacerlo en C pasando las variables por referencia &, pero afaik no en Java sin usar objetos.

2

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.

-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

Esta función intercambiar dos enteros

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

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:

  1. El valor original de b se evalúa con el fin de ser pasado como el primer argumento de la función
  2. la expresión b = a se evalúa, y el resultado (el nuevo valor de b) se pasa como el segundo argumento de la función
  3. la función ejecuta, devolviendo el valor original de b e ignorando su nuevo valor
  4. 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 :-)

+1

Si nombra su función '_', entonces ** puede ** escribir **' a = b; b = a; '**. Vea qué tan limpio (?) Parece: ** 'a = _ (b, b = a);' ** – marcus

+2

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

+0

esto es horrible e ilegible, ¿quién querrá hacer esto? – maazza

3

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); 
+0

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

+0

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

1

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

+0

Esto respondió a la pregunta tal como está escrita: ¿por qué el voto a favor? – wonderer

-1

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

+0

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. –

1

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

3

de una sola línea para cualquier número primitivos:

a += (b - (b = a)); 
Cuestiones relacionadas