有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:Shift/Rotate对象数组

我的问题其实应该很简单: 我有一个玩家的对象数组。(玩家[]) 我希望有一个函数可以旋转此数组直到索引:

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

这将改变

{Player1, Player2, Player3, Player4, Player5}

索引为2到:

{Player3, Player4, Player5, Player1, Player2}

但我想防止引用出现问题。 我试过这个系统。arraycopy()但要么是因为我太笨而无法让它工作,要么就是因为我使用了错误的方法


共 (3) 个答案

  1. # 1 楼答案

    为了使用arraycopy,需要制作阵列的副本,我建议使用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);
    }
    
  2. # 2 楼答案

    此单线解决方案将阵列旋转到位,具有恒定的额外内存和线性时间:

    Collections.rotate(Arrays.asList(array), -index);
    
  3. # 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;
        }
      }