您编写的函数不会对 'a' 和 'b' 的值执行任何交换,因为在 java 中,原始类型的值是按值传递的。
public void swap(int a, int b) {
a ^= b;
b = a ^ b;
a = a ^ b;
}
通过将值放入长度为 1 的数组然后执行交换操作所建议的功能将作为数组传递引用。
public void swap(int[] a, int[] b) {
a[0] ^= b[0];
b[0] = a[0] ^ b[0];
a[0] = a[0] ^ b[0];
}
但是,如果数组 a 和 b 都引用同一个数组,则该函数将失败。上述函数将使作为两个参数的参数传递的数组的第零个元素为零。所以我们需要把上面的函数改成如下方式:-
public void swap(int[] a, int[] b) {
if (a == b) { //do not swap
return;
}
if (a ==null) {
return;
}
if (b ==null) {
return;
}
a[0] ^= b[0];
b[0] = a[0] ^ b[0];
a[0] = a[0] ^ b[0];
}
我将为上述代码推荐一些 Junit 测试用例。您可以使用 JUnit 包中的 assertEquals() 来测试 a[1] 和 b[1] 中的值是否被交换。
//both a[0] and b[0] are different values
int[] a = {4};
int[] b = {5};
int copy_a = a[0];
int copy_b = b[0];
swap(a, b);
assertEquals("copy_a should be b[0]", copy_a, b[0]);
assertEquals("copy_b should be a[0]", copy_b, a[0]);
//both a[0] and b[0] are same values
a[0] = 4;
b[0] = 4;
copy_a = a[0];
copy_b = b[0];
swap(a, b);
assertEquals("copy_a should be copy_b", copy_a == copy_b, a[0] == b[0]);
//case when you pass same array as both arguments.
a[0] = 9;
copy_a = a[0];
swap(a, a);
assertEquals("copy_a should be a[0]", copy_a, a[0]);
除了上面推荐的测试用例,你还可以在 a[] 或 b[] 中的任何一个为空时编写测试用例。希望这会有所帮助。