Java:Shift / Rotate Object Array

时间:2013-09-14 15:37:08

标签: java arrays sorting reference rotation

我的问题实际上应该非常简单: 我有一个玩家对象数组。(玩家[]) 我想有一个函数来旋转这个数组,直到索引:

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

这会转换

{Player1, Player2, Player3, Player4, Player5}
索引为2的

{Player3, Player4, Player5, Player1, Player2}

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

3 个答案:

答案 0 :(得分:17)

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

Collections.rotate(Arrays.asList(array), -index);

答案 1 :(得分: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;
    }
  }

答案 2 :(得分: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);
}