Tak więc mój program potrzebuje typu okrągłej tablicy ArrayList.Circular ArrayList (rozszerzenie ArrayList)
Tylko okrągły rzeczą musi być metoda get (int index), jest to oryginalny:
/**
* 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);
}
Jeśli indeks jest -1 powinien dostać element z indeksu ArrayList.size() - 1 i jeśli indeks to ArrayList.size(), powinien otrzymać element o indeksie 0.
Najprostszym sposobem osiągnięcia tego, co przyszło mi do głowy, jest po prostu rozszerzenie ArrayList z pakietu java.util i po prostu przesłonięcie get (int index), więc nie rzuca IndexOutOfBoundsException dla dwóch indeksów powyżej, ale zmień je na to, co chcę. Wyrzuciłoby wyjątek IndexOutOfBoundsException dla każdego innego indeksu, który jest poza zakresem.
Jednak od elementData (indeks) dostęp do
private transient Object[] elementData;
Nie mogę pracować, bo moja klasa nie widzi go, ponieważ jest prywatne.
Poza tym nie chcę używać do tego żadnych zewnętrznych bibliotek, ponieważ uważam, że nie ma w nim nic, co odpowiadałoby moim potrzebom, ponieważ nie chcę prawdziwej okrągłej tablicy, ale tylko części jej funkcjonalności, odpoczynku jest to zwykła tablica ArrayList.
Mam więc dwa pytania:
Jak mogę to wykonać? Czy istnieje sposób, aby to zrobić bez kopiowania całej klasy ArrayList wraz z AbstractCollection, Collection i Iterable do mojego programu? To wydaje mi się złym projektem nawet dla mnie.
Jeśli mogę jakoś sprawić, żeby działało, czy jest coś jeszcze, czego powinienem uważać? Jeśli dokonam opisanych powyżej zmian, czy to zmieniłoby zachowanie klasy tylko tak, jak tego chcę, czy też może nastąpiły jakieś niepożądane zmiany w zachowaniu?
EDIT: Dzięki za odpowiedź, oto co zrobiłem:
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);
}
}
Będzie owinąć wokół ArrayList, ale tylko o jeden. Chcę, aby rzucił wyjątek, jeśli próbuję uzyskać dostęp do dowolnego innego elementu oprócz pierwszego i ostatniego z czymkolwiek poza zwykłymi indeksami ArrayList.
Czy próbowałeś tylko przy użyciu funkcji, która przekłada swój indeks do ważnej wartości? Podobnie jak "index = index% list.size();", po którym następuje 'if (index <0) index = list.size() + index;'. – SamYonnou