public class Inteiro {
public int valor;
@Override
public String toString() {
return super.toString() + ".valor = " + String.valueOf(valor);
}
static void troca1(int x, int y) {
System.out.printf("troca1 inicio: x = %d, y = %d\n", x, y);
int aux = x; x = y; y = aux;
System.out.printf("troca1 fim : x = %d, y = %d\n", x, y);
}
static void troca2(int[] a, int i, int j) {
System.out.printf("troca2 inicio: a[%d] = %d, a[%d] = %d\n", i, a[i], j, a[j]);
int aux = a[i]; a[i] = a[j]; a[j] = aux;
System.out.printf("troca2 fim : a[%d] = %d, a[%d] = %d\n", i, a[i], j, a[j]);
}
static void troca3(Inteiro u, Inteiro v) {
System.out.printf("troca3 inicio: u = %s, v = %s\n", u, v);
Inteiro aux = u; u = v; v = aux;
System.out.printf("troca3 fim : u = %s, v = %s\n", u, v);
}
static void troca4(Inteiro u, Inteiro v) {
System.out.printf("troca4 inicio: u = %d, v = %d\n", u.valor, v.valor);
int aux = u.valor; u.valor = v.valor; v.valor = aux;
System.out.printf("troca4 fim : u = %d, v = %d\n", u.valor, v.valor);
}
public static void main(String[] args) {
int x = 0, y = 1;
System.out.printf("antes de 1 : x = %d, y = %d\n", x, y);
troca1(x,y);
System.out.printf("depois de 1 : x = %d, y = %d\n", x, y);
int[] a = { 2, 3 };
System.out.printf("antes de 2 : a[0] = %d, a[1] = %d\n", a[0], a[1]);
troca2(a,0,1);
System.out.printf("depois de 2 : a[0] = %d, a[1] = %d\n", a[0], a[1]);
Inteiro u = new Inteiro(); u.valor = 4;
Inteiro v = new Inteiro(); v.valor = 5;
System.out.printf("antes de 3 : u = %s, v = %s\n", u, v);
troca3(u,v);
System.out.printf("depois de 3 : u = %s, v = %s\n", u, v);
u = new Inteiro(); u.valor = 6;
v = new Inteiro(); v.valor = 7;
System.out.printf("antes de 4 : u = %d, v = %d\n", u.valor, v.valor);
troca4(u,v);
System.out.printf("depois de 4 : u = %d, v = %d\n", u.valor, v.valor);
}
}
Corrigindo o que disse antes, somente troca2 e troca4 vão funcionar.
antes de 1 : x = 0, y = 1
troca1 inicio: x = 0, y = 1
troca1 fim : x = 1, y = 0
depois de 1 : x = 0, y = 1
antes de 2 : a[0] = 2, a[1] = 3
troca2 inicio: a[0] = 2, a[1] = 3
troca2 fim : a[0] = 3, a[1] = 2
depois de 2 : a[0] = 3, a[1] = 2
antes de 3 : u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
troca3 inicio: u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
troca3 fim : u = Inteiro@69b332.valor = 5, v = Inteiro@1b67f74.valor = 4
depois de 3 : u = Inteiro@1b67f74.valor = 4, v = Inteiro@69b332.valor = 5
antes de 4 : u = 6, v = 7
troca4 inicio: u = 6, v = 7
troca4 fim : u = 7, v = 6
depois de 4 : u = 7, v = 6
Lembre-se que os valores nos parâmetros são variáveis locais, cópias das passadas. Mudanças nelas não afetarão as variáveis no método que as chamou. Mudanças no interior delas porém, afetam, como é o caso de troca 2 e 4.