thomas programación programacion orientada objetos libro lenguaje introducción fundamentos desde definicion con cero java swap

programación - Cómo escribir una función de intercambio básica en Java



libro de programacion en java netbeans pdf (19)

Clasificando dos ints

La respuesta corta es: no puedes hacer eso, java no tiene punteros.

Pero aquí hay algo similar que puedes hacer:

public void swap(AtomicInteger a, AtomicInteger b){ // look mom, no tmp variables needed a.set(b.getAndSet(a.get())); }

Puede hacer esto con todo tipo de objetos contenedores (como colecciones y matrices u objetos personalizados con una propiedad int), pero no con primitivas y sus envolturas (porque todas son inmutables). Pero la única forma de hacerlo de una sola línea es con AtomicInteger, supongo.

Por cierto: si tus datos pasan a ser una lista, una mejor forma de intercambiarlos es usar Collections.swap(List, int, int) :

Swaps the elements at the specified positions in the specified list. (If the specified positions are equal, invoking this method leaves the list unchanged.) Parameters: list - The list in which to swap elements. i - the index of one element to be swapped. j - the index of the other element to be swapped.

Ordenar una matriz int []

aparentemente el verdadero objetivo es ordenar una matriz de enteros. Es un proyecto de una sola línea con Arrays.sort(int[]) :

int[] arr = {2,3,1,378,19,25}; Arrays.sort(arr);

Para verificar el resultado:

System.out.println(Arrays.toString(arr)); // [1, 2, 3, 19, 25, 378]

Y aquí hay una función auxiliar simple para intercambiar dos posiciones en una matriz de entradas:

public static void swap(final int[] arr, final int pos1, final int pos2){ final int temp = arr[pos1]; arr[pos1] = arr[pos2]; arr[pos2] = temp; }

Esta pregunta ya tiene una respuesta aquí:

Soy nuevo en Java Cómo escribir el equivalente de Java del siguiente código de C.

void Swap(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; }


¿Qué hay del poderoso IntHolder? Me encanta cualquier paquete con omg en el nombre!

import org.omg.CORBA.IntHolder; IntHolder a = new IntHolder(p); IntHolder b = new IntHolder(q); swap(a, b); p = a.value; q = b.value; void swap(IntHolder a, IntHolder b) { int temp = a.value; a.value = b.value; b.value = temp; }


Aquí hay un método para intercambiar dos variables en Java en una sola línea usando el operador de bit XOR (^) .

class Swap { public static void main (String[] args) { int x = 5, y = 10; x = x ^ y ^ (y = x); System.out.println("New values of x and y are "+ x + ", " + y); } }

Salida:

Nuevos valores de xey son 10, 5


Aquí hay un truco:

public static int getItself(int itself, int dummy) { return itself; } public static void main(String[] args) { int a = 10; int b = 20; a = getItself(b, b = a); }


El intercambio mediante puntero no es posible en java. Sin embargo , puede implementar el intercambio pasando una matriz que contenga dos objetos.

El código es así:

public class Swap { public static void swap(String [] a){ String temp; temp = a[0]; a[0] = a[1]; a[1] = temp; } public static void main(String [] args){ String [] foo = new String[2]; foo[0] = "str1"; foo[1] = "str2"; swap(foo); System.out.println("First value: "+ foo[0]); System.out.println("Second value: "+ foo[1]); } }

Salida:

First value: str2 Second value: str1


En casos como ese, hay una solución rápida y sucia que usa arreglos con un elemento:

public void swap(int[] a, int[] b) { int temp = a[0]; a[0] = b[0]; b[0] = temp; }

Por supuesto, su código también debe funcionar con estas matrices, lo cual es inconveniente. El truco de matriz es más útil si desea modificar una variable final local de una clase interna:

public void test() { final int[] a = int[]{ 42 }; new Thread(new Runnable(){ public void run(){ a[0] += 10; }}).start(); while(a[0] == 42) { System.out.println("waiting..."); } System.out.println(a[0]); }


Java es pasar por valor. Entonces el swap en el sentido en que te refieres no es posible. Pero puede intercambiar el contenido de dos objetos o hacerlo en línea.


Java usa pass-by-value . No es posible intercambiar dos primitivos u objetos usando un método.

Aunque es posible intercambiar dos elementos en una matriz de enteros.


No hay punteros en Java. Sin embargo, cada variable que "contiene" un objeto es una referencia a ese objeto. Para tener parámetros de salida, debería usar objetos. En tu caso, objetos enteros.

Entonces tendría que hacer un objeto que contenga un entero, y cambiar ese entero. No puede usar la clase Integer, ya que es inmutable (es decir, su valor no se puede cambiar).

Una alternativa es dejar que el método devuelva una matriz o par de entradas.


No puede usar referencias en Java, por lo que una función de intercambio es imposible, pero puede usar el siguiente fragmento de código por cada uso de operaciones de intercambio:

T t = p p = q q = t

donde T es el tipo de p yq

Sin embargo, puede ser posible intercambiar objetos mutables reescribiendo propiedades:

void swap(Point a, Point b) { int tx = a.x, ty = a.y; a.x = b.x; a.y = b.y; b.x = t.x; b.y = t.y; }



Snippet-1

public int[] swap1(int[] values) { if (values == null || values.length != 2) throw new IllegalArgumentException("parameter must be an array of size 2"); int temp = values[0]; values[0]=values[1]; values[1]=temp; return values; }

Snippet-2

public Point swap2(java.awt.Point p) { if (p == null) throw new NullPointerException(); int temp = p.x; p.x = p.y; p.y = temp; return p; }

Uso:

int[] values = swap1(new int[]{x,y}); x = values[0]; y = values[1]; Point p = swap2(new Point(x,y)); x = p.x; y = p.y;


Su función de intercambio está esencialmente cambiando los valores en dos pedazos de memoria. Cualquier cosa que haga referencia a esos bits de memoria ahora obtendrá diferentes valores.

En Java no hay punteros realmente, así que esto no funcionará. En cambio, las referencias se llevan a cabo en objetos, y solo puede cambiar cosas dentro de los objetos. Si necesita hacer referencia a un objeto en dos lugares, para poder pasar los mismos valores alrededor del sistema y hacer que las cosas reaccionen al cambio, pruebe algo como el patrón de repositorio o la inyección de dependencia .

Solo podemos adivinar por qué necesita este código en C. El único consejo que puedo dar es que piense en los cambios a los objetos que desea lograr, preferiblemente agregue un método en los objetos reales en lugar de extraer sus internos, y llama ese método en su lugar. Si esto no lo ayuda, intente publicar el código de llamada ya que probablemente tendremos una buena idea de cómo resolver el problema real del estilo Java.


Tienes que hacerlo en línea. Pero realmente no necesitas ese intercambio en Java.


Usted puede escribir uno fácilmente.

dado:

int array[]={1,2};

tú lo haces:

int temp=array[0]; array[0]=array[1]; array[1]=temp;

Y tu estas listo. 3 líneas de código


Utilice este delineador para cualquier clase de números primitivos, incluidos el double y float :

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

Por ejemplo:

double a = 1.41; double b = 0; a += (b - (b = a)); System.out.println("a = " + a + ", b = " + b);

La salida es a = 0.0, b = 1.41


class Swap2Values{ public static void main(String[] args){ int a = 20, b = 10; //before swaping System.out.print("Before Swapping the values of a and b are: a = "+a+", b = "+b); //swapping a = a + b; b = a - b; a = a - b; //after swapping System.out.print("After Swapping the values of a and b are: a = "+a+", b = "+b); } }


//here is also another answer: class SwapDemo{ static int a=1, b=2 ; public static void main(String [] args){ Swap swp = new Swap(); swp.swaps(x,y); System.out.println( " a (was 1)now is " + a + " b (was 2) now is " + b); } } class Swap{ void swaps(int c, int d){ SwapDemo f = new SwapDemo(); f.a = c; f.a = d; } }


public class swaptemp { public static void main(String[] args) { String s1="10"; String s2="20"; String temp; System.out.println(s1); System.out.println(s2); temp=Integer.toString(Integer.parseInt(s1)); s1=Integer.toString(Integer.parseInt(s2)); s2=Integer.toString(Integer.parseInt(temp)); System.out.println(s1); System.out.println(s2); } }