ti-enxame.com

Como escrever uma função básica de troca em Java

Eu sou novo em Java. Como escrever o Java equivalente ao seguinte código C.

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

Aqui está um truque:

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);
}
81
Eng.Fouad

Classificando dois inteiros

A resposta curta é: você não pode fazer isso, Java não tem ponteiros.

Mas aqui está algo parecido que você pode fazer:

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

Você pode fazer isso com todos os tipos de objetos contêineres (como coleções e arrays ou objetos personalizados com uma propriedade int), mas não apenas com primitivos e seus invólucros (porque todos eles são imutáveis). Mas a única maneira de torná-lo um one-liner é com o AtomicInteger, eu acho.

BTW: se seus dados forem uma List, a melhor maneira de trocar é 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. 

Classificando um array int []

aparentemente, o objetivo real é classificar uma matriz de ints. Isso é um one-liner com Arrays.sort(int[]) :

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

Para verificar a saída:

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

E aqui está uma função auxiliar simples para trocar duas posições em uma matriz de ints:

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;
}
38
Sean Patrick Floyd

Aqui está um método para trocar duas variáveis ​​em Java em apenas uma linha usando bitwise operador 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);
   }
} 

saída:

Novos valores de x e y são 10, 5

36
Prateek Joshi

Use este one-liner para qualquer classe numérica primitiva incluindo double e float:

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

Por exemplo:

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

A saída é a = 0.0, b = 1.41

9
Oleg Mikhailov

Não há ponteiros em Java. No entanto, cada variável que "contém" um objeto é um referência para esse objeto. Para ter parâmetros de saída, você teria que usar objetos. No seu caso, objetos inteiros.

Então você teria que fazer um objeto que contenha um inteiro, e mudar esse inteiro. Você não pode usar a classe Integer, já que ela é imutável (ou seja, seu valor não pode ser alterado).

Uma alternativa é deixar o método retornar um array ou um par de ints.

4
Sjoerd

E o poderoso IntHolder? Eu simplesmente amo qualquer pacote com omg no nome!

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;
}
3
PowerApp101

Java usa pass-by-value . Não é possível trocar duas primitivas ou objetos usando um método.

Embora seja possível trocar dois elementos em um array inteiro.

2
codaddict

Em casos como esse, há uma solução rápida e suja usando matrizes com um elemento:

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

É claro que seu código também tem que trabalhar com esses arrays, o que é inconveniente. O truque da matriz é mais útil se você quiser modificar uma variável final local de uma classe 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]);   
} 
2
Landei

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;
2
Andreas_D

Java é passado por valor. Então o swap no sentido que você quer dizer não é possível. Mas você pode trocar o conteúdo de dois objetos ou fazê-lo em linha.

1
fastcodejava

Não é possível usar referências em Java, portanto, uma função de troca é impossível, mas você pode usar o seguinte trecho de código para cada uso de operações de troca:

T t = p
p = q
q = t

onde T é o tipo de peq

No entanto, a troca de objetos mutáveis ​​pode ser possível ao reescrever propriedades:

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;
}
1
Ming-Tang

Você tem que fazer isso inline. Mas você realmente não precisa dessa troca em Java.

1
Bart

Você pode trocar variáveis ​​com ou sem o uso de uma variável temporária.

Aqui está um artigo que fornece vários métodos para trocar números sem variável temporária:

http://topjavatutorial.com/Java/java-programs/swap-two-numbers-without-a-temporary-variable-in-Java/

1
Sekhar Ray

Sua função de troca está basicamente alterando os valores em duas partes de memória. Qualquer coisa que faça referência a esses bits de memória agora terá valores diferentes.

Em Java não há ponteiros, então isso não funcionará. Em vez disso, as referências são mantidas em objetos e você só pode alterar as coisas dentro dos objetos. Se você precisar referenciar um objeto em dois lugares, para poder passar os mesmos valores pelo sistema e fazer com que as coisas reajam a eles, tente algo como o padrão do repositório ou injeção de dependência .

Podemos apenas imaginar por que você precisava desse código em C. O único conselho que posso dar é pensar nas mudanças nos objetos que você deseja alcançar, de preferência adicionar um método aos objetos reais em vez de puxar seus internos para fora, e chame esse método em vez disso. Se isso não ajudar você, tente postar o código de chamada, pois provavelmente teremos uma boa idéia de como resolver o problema real do estilo Java.

1
Lunivore
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);
    }
}
0
user5962065

Trocar usando ponteiro é não possível em Java. No entanto, você pode implementar o swapping passando array contendo dois objetos.

Código é assim:

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]);
    }
}

Saída:

First value: str2
Second value: str1
0
Nabin Bhandari

Você pode facilmente escrever um você mesmo.

dado:

int array[]={1,2};

você faz:

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

E você está feito. linhas de código.

0
Yunus Seçgin