したがって、私のプログラムには循環型の ArrayList が必要です。
get(int index) メソッドでなければならないのは循環的なことだけです。これはオリジナルです:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
index が -1 の場合、インデックス ArrayList.size()-1 の要素を取得する必要があり、index が ArrayList.size() の場合、インデックス 0 の要素を取得する必要があります。
これを実現する最も簡単な方法は、単純に java.util パッケージから ArrayList を拡張し、get(int インデックス) をオーバーライドすることです。これにより、上記の 2 つのインデックスに対して IndexOutOfBoundsException がスローされず、必要なものに変更されます。範囲外の他のインデックスに対して IndexOutOfBoundsException をスローします。
ただし、elementData(index) は
private transient Object[] elementData;
プライベートであるため、クラスには表示されないため、機能させることができません。
また、これには外部ライブラリを使用したくありません。これは、実際のcircularArrayが必要ないため、ニーズに合ったものがないと思うためですが、その機能の一部のみであり、残りの部分は通常のArrayList。
だから私は2つの質問があります:
どうすればこれを機能させることができますか?ArrayList クラス全体を AbstractCollection、Collection、および Iterable と共にプログラムにコピーせずにそれを行う方法はありますか? それは私にとっても悪いデザインのようです。
どうにかしてそれを機能させることができれば、他に注意すべきことはありますか? 上記の変更を行った場合、クラスの動作は希望どおりに変更されますか?それとも、他の望ましくない動作の変更がある可能性がありますか?
編集: 答えてくれてありがとう、これが私がやったことです:
import java.util.ArrayList;
public class CircularArrayList<E> extends ArrayList<E>
{
private static final long serialVersionUID = 1L;
public E get(int index)
{
if (index == -1)
{
index = size()-1;
}
else if (index == size())
{
index = 0;
}
return super.get(index);
}
}
ArrayList をラップしますが、1 つだけです。他の要素にアクセスしようとすると、最初と最後に通常の ArrayList インデックス以外のものにアクセスしようとすると、例外がスローされるようにします。