Java - 在数组中交换

时间:2015-02-05 17:41:49

标签: java arrays swap

我想在数组中交换2个值... 这是我的代码:

    static void swap (Integer[] input, int i, int j) {

    /*
     * Assure indices are allright!
     */
    if (i < 0 || i >= input.length)
        throw new IllegalArgumentException("Incorrect i!");
    if (j < 0 || j >= input.length)
        throw new IllegalArgumentException("Incorrect j!");

    /*
     * (***) This method does not work... Why? (***)
     */
     input[i] ^= input[j];
     input[j] ^= input[i];
     input[i] ^= input[j];

    /*
     * This works...
     */
    /*int temp = input[j];
    input[j] = input[i];
    input[i] = temp;*/
}

为什么中间的方法(***)不起作用?

2 个答案:

答案 0 :(得分:2)

这是XOR Swap Algorithm的一个版本,它不是像Java这样的动态语言的非常有效的优化。相反,我建议您尝试Write Dumb Code;并且你已经使用临时变量进行了工作交换(这对我来说似乎是最好的解决方案)所以我想我会给你一个正确的xor交换...最后一点,请确保不要尝试这个{ {1}} ...

i == j

如果你在i等于j时尝试减法(或xor),你将得到零。

答案 1 :(得分:2)

它确实有效,至少有时候。您应该使用示例输入和输出更好地解释问题。这是一个有效的测试:

import org.junit.Assert;
import org.junit.Test;

public final class Swapper
{

  @Test
  public void testSwap()
  {
    Integer[] input = {1, 2, 3};
    swap(input, 0, 2);
    Assert.assertArrayEquals(new Integer[]{3, 2, 1}, input);
  }

  @Test
  public void testNoop()
  {
    Integer[] input = {1, 2, 3};
    swap(input, 1, 1);
    Assert.assertArrayEquals(new Integer[]{1, 2, 3}, input);
  }

  static void swap(Integer[] input, int i, int j)
  {
    if (i < 0 || i >= input.length)
      throw new IndexOutOfBoundsException(Integer.toString(i));
    if (j < 0 || j >= input.length)
      throw new IndexOutOfBoundsException(Integer.toString(j));
    input[i] = input[i] + input[j];
    input[j] = input[i] - input[j];
    input[i] = input[i] - input[j];
  }

}

正如您已经发现的那样,当ij相等时,您的方法将失败。通过在验证索引范围后检查该条件,可以很容易地解决这个问题。

也就是说,这是交换元素的一种可怕方式,因为Java使用基本类型(如int及其Object对应项的方式,如Integer。您正在创建大量Integer个对象实例,并且这可能比使用局部变量来保存传输中的元素要慢很多。