我的问题实际上应该非常简单: 我有一个玩家对象数组。(玩家[]) 我想有一个函数来旋转这个数组,直到索引:
public void rotateArray(Object[] array, int index)
这会转换
{Player1, Player2, Player3, Player4, Player5}
索引为2的:
{Player3, Player4, Player5, Player1, Player2}
但我想防止引用问题。 我已经尝试过System.arraycopy(),但要么是愚蠢才能使它工作,否则我就是错误的方法。
答案 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);
}