как сделать свою функцию swap в java?
как я могу сделать свою функцию swap в java, если нет метода, по которому мы можем пройти по ссылке? Может ли кто-нибудь дать мне код?
swap(int a, int b) { int temp = a; a = b; b = temp; }
но изменение не будет отражено обратно, поскольку java передает значение
- Как я могу использовать пользовательский растровый рисунок для точки «вы здесь» в MyLocationOverlay?
- Получение NoClassDefFoundError при использовании common.lang.StringUtils в javas-коде android?
- Могут ли новые версии JRE запускать Java-программы, скомпилированные со старыми версиями JDK?
- размещение файла в пути к classам
- Ошибка MultiDex NoClassDefFound
- Трансляция, когда состояние сети изменилось
- Как сгруппировать сетку 3x3 переключателей?
- Максимальный размер метода в java?
- Элегантный способ чтения файла в массив byte в Java
- Ошибка раздувания при расширении classа
- Текст Android-центра на canvasе
- Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
- Как сделать копию файла в андроиде?
Вы не можете создать метод 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);