Итак, моя программа нуждается в типе кругового массива ArrayList.Circular ArrayList (расширение ArrayList)
только круговая вещь об этом должно быть методом прибудет (индекс INT), это оригинал:
/**
* 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);
}
Если индекс равен -1 он должен получить элемент с индексом ArrayList.size() - 1, и если индексом является ArrayList.size(), он должен получить элемент с индексом 0.
Простейший способ достичь этого, который пришел мне на ум, - это просто расширить ArrayList из пакета java.util и просто переопределить get (int index), поэтому он не бросает IndexOutOfBoundsException для двух указанных выше индексов, но меняет их на то, что я хочу. Он будет генерировать IndexOutOfBoundsException для любого другого индекса, который выходит за рамки.
Однако, поскольку elementData (индекс) получить доступ к
private transient Object[] elementData;
Я не могу заставить его работать, потому что мой класс не видит его, так как это личное.
Кроме того, я не хочу использовать какие-либо внешние библиотеки для этого, просто потому, что я думаю, что нет таких, которые бы соответствовали моим потребностям, так как я не хочу реального кругового массива, а только часть его функциональности, отдыхаю из этого является регулярным ArrayList.
Поэтому у меня есть два вопроса:
Как я могу сделать эту работу? Есть ли способ сделать это, не копируя весь класс ArrayList вместе с AbstractCollection, Collection и Iterable в мою программу? Это кажется плохим дизайном даже для меня.
Если я могу как-то заставить его работать, есть ли что-нибудь еще, на что я должен смотреть? Если я сделаю описанные выше изменения, изменит ли поведение класса только то, как я его хочу, или могут возникнуть какие-либо другие нежелательные изменения поведения?
EDIT: Спасибо за ответ, вот что я сделал:
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, но только один. Я хочу, чтобы он выдавал исключение, если я пытаюсь получить доступ к любому другому элементу, кроме первого и последнего, с чем-либо, кроме своих обычных индексов ArrayList.
вы пробовали просто использовать функцию, которая переводит ваш индекс в действительное значение? Подобно 'index = index% list.size();' затем следует 'if (index <0) index = list.size() + index;'. – SamYonnou