たとえば、次の内容の配列があります: a、b、c、d、e、f
結果を次のようにしたい: b, c, d, e, f, a
どうすればいいですか?
arraycopyを使用します。
var t = arr[0];
System.arraycopy(arr, 1, arr, 0, arr.length-1);
arr[arr.length-1] = t;
javadoc は、この操作が安全であることを示しています。
src 引数と dest 引数が同じ配列オブジェクトを参照する場合、srcPos から srcPos+length-1 までの位置にあるコンポーネントが最初に長さコンポーネントを持つ一時配列にコピーされ、次に一時配列の内容がコピーされたかのように、コピーが実行されます。宛先配列の destPos + length-1 から位置 destPos にコピーされます。
Collections.rotate(Arrays.asList(array), -1);
ArrayList を使用してみてください。自動的にシフトする優れたメソッドがいくつかあります。試す
myArrayList.add(0,myArrayList.remove(myArrayList.size()-1))
LinkedList はこれを高速に行うことができますが、ほとんどの場合、これを行う必要はありません。代わりに、配列の内容を変更せずに開始インデックスを定義する方がはるかに簡単です。
例えば、
int start = 5;
for (int i=start, j=0; j<arr.length; i++, j++) {
if (i == arr.length) {
i = 0;
}
// do something with arr[i]
}
配列をコピーすることも別の解決策ですが、配列を頻繁にローテーションする場合は、コンテンツを変更したり、新しい配列を作成したりしないことをお勧めします。開始インデックスを定義することで、いつでも開始点を変更できます。