как сделать свою функцию swap в java?

как я могу сделать свою функцию swap в java, если нет метода, по которому мы можем пройти по ссылке? Может ли кто-нибудь дать мне код?

swap(int a, int b) { int temp = a; a = b; b = temp; } 

но изменение не будет отражено обратно, поскольку java передает значение

Вы не можете создать метод swap, так что после вызова swap(x,y) значения x и y будут заменены. Вы можете создать такой метод для изменяемых classов, заменив их содержимое¹, но это не изменит их идентификатор объекта, и вы не сможете определить общий метод для этого.

Однако вы можете написать метод, который обменивает два элемента в массиве или списке, если это то, что вы хотите.

¹ Например, вы можете создать метод swap, который принимает два списка, и после выполнения метода список x будет иметь предыдущее содержимое списка y, а в списке y будет указано предыдущее содержимое списка x.

Я думаю, что это самое близкое к простому обмену, но у него нет простой схемы использования:

 int swap(int a, int b) { // usage: y = swap(x, x=y); return a; } y = swap(x, x=y); 

Он полагается на то, что x переходит в swap до того, как y будет присвоено x , тогда x возвращается и назначается y .

Вы можете сделать его общим и обменивать любое количество объектов одного типа:

  T swap(T... args) { // usage: z = swap(a, a=b, b=c, ... y=z); return args[0]; } c = swap(a, a=b, b=c) 

Это зависит от того, что вы хотите сделать. Этот код заменяет два элемента массива.

 void swap(int i, int j, int[] arr) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } 

Что-то вроде этого обменивает содержимое двух int[] равной длины.

 void swap(int[] arr1, int[] arr2) { int[] t = arr1.clone(); System.arraycopy(arr2, 0, arr1, 0, t.length); System.arraycopy(t, 0, arr2, 0, t.length); } 

Что-то вроде этого BitSet содержимое двух BitSet (с использованием алгоритма замены XOR ):

 void swap(BitSet s1, BitSet s2) { s1.xor(s2); s2.xor(s1); s1.xor(s2); } 

Что-то вроде этого меняет местами x и y некоторого classа Point :

 void swapXY(Point p) { int t = px; px = py; py = t; } 

По-видимому, у меня недостаточно очков репутации, чтобы прокомментировать ответ Дэнсальмо , но он хороший, хотя и неправильно названный. Его ответ на самом деле является K-комбинатором.

 int K( int a, int b ) { return a; } 

JLS специфичен для оценки аргументов при передаче методам / ctors / etc. (Разве это не так в старых спецификациях?)

Конечно, это функциональная идиома, но это достаточно ясно для тех, кто ее узнает. (Если вы не понимаете код, который вы находите, не связывайтесь с ним!)

 y = K(x, x=y); // swap x and y 

K-combinator специально разработан для такого рода вещей. AFAIK нет причин, по которым он не должен проходить проверку кода.

Мои $ 0,02.

AFAIS, никто не упоминает атомную ссылку .

целое число

 public void swap(AtomicInteger a, AtomicInteger b){ a.set(b.getAndSet(a.get())); } 

строка

 public void swap(AtomicReference a, AtomicReference b){ a.set(b.getAndSet(a.get())); } 

Я мог бы сделать что-то вроде следующего. Конечно, с богатством classов Collection, я не могу себе представить, что когда-либо понадобится использовать это в любом практическом коде.

 public class Shift { public static  T[] left (final T... i) { if (1 >= i.length) { return i; } final T t = i[0]; int x = 0; for (; x < i.length - 1; x++) { i[x] = i[x + 1]; } i[x] = t; return i; } } 

Вызывается с двумя аргументами, это своп.

Его можно использовать следующим образом:

 int x = 1; int y = 2; Integer[] yx = Shift.left(x,y); 

В качестве альтернативы:

 Integer[] yx = {x,y}; Shift.left(yx); 

затем

 x = yx[0]; y = yx[1]; 

Примечание: это примитивы auto-boxes.

Попробуйте эту магию

 public static  void swap(T a, T b) { try { Field[] fields = a.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object temp = field.get(a); field.set(a, field.get(b)); field.set(b, temp); } } catch (IllegalAccessException e) { e.printStackTrace(); } } 

И протестируйте его!

  System.out.println("a:" + a); System.out.println("b:" + b); swap(a,b); System.out.println("a:" + a); System.out.println("b:" + b); 
  • Воспроизведение музыки BG через действия в Android
  • Преобразование base64 в изображение в Java
  • Как преобразовать Date.toString обратно в Date?
  • Каковы все различные способы создания объекта в Java?
  • Java: сумма двух целых чисел печатается как конкатенация двух
  • Android: как изменить цвет разделителя datepicker?
  • Получить контекст приложения из classа non activity singleton
  • Преобразование строки в целое число на Android
  • Создание видеофайла с изображений с помощью ffmpeg
  • Токенизация строки, но игнорирование разделителей в кавычках
  • ИК-излучатель и Android 5.0
  • Давайте будем гением компьютера.