我如何使我的交换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); 

它依赖于xy被分配给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类的xy字段:

 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; } }