我如何使我的交换function在Java?
如果没有我们可以通过引用传递的方法,如何在java中使我的交换function? 有人可以给我一个代码吗?
swap(int a, int b) { int temp = a; a = b; b = temp; }
但是这个改变不会被reflection回来,因为java通过价值
你不能创build一个方法交换,所以在调用swap(x,y)
,x和y的值将被交换。 你可以通过交换它们的内容来为这个可变类创build一个这样的方法,但是这不会改变它们的对象标识,也不能为此定义一个通用的方法。
然而,你可以写一个方法,交换数组或列表中的两个项目,如果这是你想要的。
¹例如,您可以创build一个带有两个列表的交换方法,在执行该方法后,列表x将具有列表y的先前内容,列表y将具有列表x的先前内容。
我认为这是最简单的交换,但它没有一个简单的使用模式:
int swap(int a, int b) { // usage: y = swap(x, x=y); return a; } y = swap(x, x=y);
它依赖于x
在y
被分配给x
之前将会进入swap
的事实,然后x
被返回并分配给y
。
您可以使其通用并交换任意数量的相同types的对象:
<T> 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
的内容(使用XOR交换algorithm ):
void swap(BitSet s1, BitSet s2) { s1.xor(s2); s2.xor(s1); s1.xor(s2); }
像这样的东西交换了一些Point
类的x
和y
字段:
void swapXY(Point p) { int t = px; px = py; py = t; }
显然,我没有足够的声望评论 丹萨尔莫的答案 ,但这是一个很好的名字,虽然是错误的。 他的回答实际上是一个K-combinator。
int K( int a, int b ) { return a; }
JLS在传递给methods / ctors /等时是具体的参数评估 。 (这是不是在旧的规格?)
当然,这是一个有用的习惯用语,但对于那些认识到这一点的人来说已经足够清楚了。 (如果你不明白你发现的代码,不要把它猴子!)
y = K(x, x=y); // swap x and y
K-combinator是专门为这种事情devise的。 AFAIK没有理由不通过代码审查。
我的$ 0.02。
AFAIS,没有人提到primefaces参考 。
整数
public void swap(AtomicInteger a, AtomicInteger b){ a.set(b.getAndSet(a.get())); }
串
public void swap(AtomicReference<String> a, AtomicReference<String> b){ a.set(b.getAndSet(a.get())); }
我可能会做如下的事情。 当然,有了丰富的Collection类,我无法想象在任何实际的代码中都需要使用这个类。
public class Shift { public static <T> 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];
注意:它会自动设置原语。
试试这个魔法
public static <T> 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(); } }
并testing它!
Log.e("INTERVIEW", "a:" + a); Log.e("INTERVIEW", "b:" + b); swap(a,b); Log.e("INTERVIEW", "a:" + a); Log.e("INTERVIEW", "b:" + b);
public class Swap1 { public static void main(String[] args){ int x =7; int y = 3; swap(x,y); System.out.println("x = " + x); System.out.println("y = " + y); } public static void swap(int x, int y) { int temp = x; x = y; y = temp; } }