Это не имеет никакого отношения к неизменности целых чисел; это связано с тем, что Java является Pass-by-Value, Dammit! (Не раздражает, просто заголовок статьи: p)
Подводя итог: вы действительно не можете сделать swap-метод в Java. Вам просто нужно сделать своп самостоятельно, где бы вы ни нуждались; это всего лишь три строки кода в любом случае, поэтому не должно быть такой большой проблемы:)
Thing tmp = a;
a = b;
b = tmp;
Если вы хотите реализовать метод подкачки для объектов Integer, вы должны обернуть значения в массив (или ArrayList) и поменять его внутри массива. Вот адаптация вашего кода:
public class Main {
static void swap (Integer[] values) {
if ((values == null) || (values.length != 2)) {
throw new IllegalArgumentException("Requires an array with exact two values");
}
Integer t = values[0];
values[0] = values[1];
values[1] = t;
}
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer[] integers= new Integer[]{a,b};
swap(integers);
System.out.println("a=" + integers[0] + " b=" + integers[1]);
}
}
(просто добавил этот ответ, потому что Svish упомянул, что «Вы действительно не можете создать метод swap в Java» фг )
Код Java:
class swap {
int n1;
int n2;
int n3;
void valueSwap() {
n3 = n1;
n1 = n2;
n2 = n3;
}
public static void main(String[] arguments) {
Swap trial = new Swap();
trial.n1 = 2;
trial.n2 = 3;
System.out.println("trial.n1 = " + trial.n1);
System.out.println("trial.n2 = " + trial.n2);
trial.valueSwap();
System.out.println("trial.n1 = " + trial.n1);
System.out.println("trial.n2 = " + trial.n2);
}
}
Выход:
trial.n1 = 2
trial.n2 = 3
trial.n1 = 3
trial.n2 = 2
Вам нужно будет передать параметры по ссылке, что невозможно в java. Также целые числа являются inmutables, поэтому вы не можете обменивать значения, поскольку у вас нет метода setValue.
Использование XOR-оператора - очень плохая идея:
Во-первых, это гораздо менее читаемо. Во-вторых, были времена, когда это было быстрее, но в настоящее время наоборот. См.
для справки.
Как все ребята упоминали о своей вещи «Постепенное значение».
Просто понравилось: вы можете использовать этот метод замены GLOBAL-целых чисел.
private void swap (){
a ^= b;
b ^= a;
a ^= b;
}
It исключает использование другой переменной, а ее просто кулер:)
Все в Java передается по значению, а значения переменных всегда являются примитивами или ссылками на объект.
Целое значение неизменное - вы не можете изменить свои значения. Перемещение, которое происходит внутри функции свопинга, относится к ссылкам, а не значениям.
Вам нужно будет вернуть обе ссылки в массиве для достижения желаемого
static Integer[] swap(Integer a, Integer b) {
return new Integer[]{b, a};
}
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer[] intArray = swap(a, b);
a = intArray[0];
b = intArray[1];
System.out.println("a=" + a + " b=" + b);
}
Если Integer имел метод setValue, вы могли бы сделать что-то вроде этого.
static void swap(Integer a, Integer b) {
int temp = a.intValue();
a.setValue(b.intValue());
b.setValue(temp);
}
Но это не так, чтобы достичь того, чего вы хотите, верните массив.
Использование сканера:
import java.util.*;
public class Swap {
public static void main(String[] args){
int i,temp,Num1,Num2;
Scanner sc=new Scanner(System.in);
System.out.println("Enter Number1 and Number2");
Num1=sc.nextInt();
Num2=sc.nextInt();
System.out.println("Before Swapping Num1="+Num1+" Num2="+Num2);
temp=Num1;
Num1=Num2;
Num2=temp;
System.out.println("After Swapping Num1="+Num1+" Num2="+Num2);
}
}
Как сказал Svish и другие, это вызов по значению, а не по ссылке на Java. Поскольку у вас нет указателей на Java, вам нужен какой-то объект-держатель, чтобы действительно менять значения таким образом. Например:
static void swap(AtomicReference<Integer> a, AtomicReference<Integer> b) {
Integer c = a.get();
a.set(b.get());
b.set(c);
}
public static void main(String[] args) {
AtomicReference<Integer> a = new AtomicReference<Integer>(1);
AtomicReference<Integer> b = new AtomicReference<Integer>(2);
System.out.println("a = " + a);
System.out.println("b = " + b);
swap(a, b);
System.out.println("a = " + a);
System.out.println("b = " + b);
}