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

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 に答える