4

我的问题实际上应该很简单:我有一个 Players 对象数组。(players[])我想要一个函数来旋转这个数组直到一个索引:

public void rotateArray(Object[] array, int index)

这将转换

{Player1, Player2, Player3, Player4, Player5}

索引为 2 到:

{Player3, Player4, Player5, Player1, Player2}

但我想防止引用问题。我已经尝试过 System.arraycopy() 但要么我愚蠢地让它工作,要么我是错误的方法。

4

3 回答 3

17

这种单线解决方案在原地旋转阵列,具有恒定的额外内存和线性时间:

Collections.rotate(Arrays.asList(array), -index);
于 2013-09-14T17:20:21.670 回答
3

一个更有效的大数组解决方案,使用 O(1) 空间:

 public static void rotateArray(int[] a, int i) {
    i %= a.length;
    reverse(a, 0, a.length);
    reverse(a, 0, i);
    reverse(a, i, a.length);
 }

 public static void reverse(int[] a, int l, int r) {
    for (int left = l, right = r - 1; left < right; left++, right--) {
        int temp = a[left];
        a[left]  = a[right];
        a[right] = temp;
    }
  }
于 2013-09-14T17:07:10.353 回答
2

必须制作数组的副本才能使用 arraycopy,我建议这样做,因为它应该是最快的。避免复制的唯一原因是数组非常大且内存紧张。

public void rotateArray(Object[] array, int index)
{
    Object[] result;

    result = new Object[array.length];

    System.arraycopy(array, index, result, 0, array.length - index);
    System.arraycopy(array, 0, result, array.length - index, index);

    System.arraycopy(result, 0, array, 0, array.length);
}
于 2013-09-14T15:44:29.380 回答