Muszę dodać elementy do ArrayList
kolejki, cokolwiek, ale kiedy wywołuję funkcję, aby dodać element, chcę, aby dodała element na początku tablicy (więc ma najniższy indeks) i jeśli tablica ma 10 elementów dodawania nowy powoduje usunięcie najstarszego elementu (tego o najwyższym indeksie).
Czy ktoś ma jakieś sugestie?
remove
iadd
?arraylist stack queue whatever
jako dodawania na początku tablicy, najlepiej unikać i wydaje się, że powinieneś używać innej kolekcji.Odpowiedzi:
List
ma metodęadd(int, E)
, więc możesz użyć:Następnie możesz usunąć ostatni element za pomocą:
Możesz jednak przemyśleć swoje wymagania lub użyć innej struktury danych, np
Queue
EDYTOWAĆ
Może spójrz na Apache
CircularFifoQueue
:Po prostu zainicjuj go maksymalnym rozmiarem:
źródło
Korzystanie z określonych struktur danych
Istnieją różne struktury danych, które są zoptymalizowane pod kątem dodawania elementów w pierwszym indeksie. Pamiętaj jednak, że jeśli przekonwertujesz swoją kolekcję na jedną z nich, rozmowa będzie prawdopodobnie wymagała złożoności czasowej i przestrzennej
O(n)
Deque
JDK zawiera
Deque
strukturę, która oferuje metody takie jakaddFirst(e)
iofferFirst(e)
Analiza
Złożoność przestrzenno-czasowa wstawiania jest
LinkedList
stała (O(1)
). Zobacz ściągawkę Big-O .Odwracanie listy
Bardzo prostą, ale nieefektywną metodą jest użycie odwrotności:
Jeśli korzystasz ze strumieni Java 8, ta odpowiedź może Cię zainteresować.
Analiza
O(n)
O(1)
Patrząc na implementację JDK, jest to
O(n)
skomplikowane czasowo, więc nadaje się tylko do bardzo małych list.źródło
Możesz spojrzeć na add (int index, E element) :
Po dodaniu możesz sprawdzić rozmiar ArrayList i usunąć te na końcu.
źródło
Możesz spojrzeć na Deque. daje bezpośredni dostęp do pierwszej i ostatniej pozycji na liście.
źródło
To, co opisujesz, jest odpowiednią sytuacją do wykorzystania
Queue
.Ponieważ chcesz
add
nowego elementu iremove
starego. Możesz dodawać na końcu i usuwać od początku. To nie będzie miało większego znaczenia.Kolejka ma metody
add(e)
iremove()
która dodaje na końcu nowy element i odpowiednio usuwa z początku stary element.Tak więc za każdym razem, gdy dodajesz element do elementu,
queue
możesz utworzyć jego kopię zapasową za pomocąremove
wywołania metody.AKTUALIZACJA : -
A jeśli chcesz poprawić rozmiar
Queue
, możesz spojrzeć na: -ApacheCommons#CircularFifoBuffer
Od
documentation
: -Jak widać, po osiągnięciu maksymalnego rozmiaru, dodanie nowego elementu automatycznie usuwa pierwszy wstawiony element.
źródło
Myślę, że implementacja powinna być łatwa, ale biorąc pod uwagę wydajność, jako kontenera należy użyć LinkedList, ale nie ArrayList. Możesz odwołać się do następującego kodu:
źródło
Java LinkedList udostępnia zarówno metodę addFirst (E e), jak i push (E e), które dodają element na początek listy.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
źródło
możesz użyć tego kodu
źródło
Możesz używać metod listowych, usuwać i dodawać
źródło
Weź ten przykład: -
źródło
Możesz użyć
Zmień E na swój typ danych
Jeśli usunięcie najstarszego elementu jest konieczne, możesz dodać:
przed zwrotem. W przeciwnym razie lista doda twój obiekt na początku i zachowa najstarszy element.
Spowoduje to usunięcie ostatniego elementu z listy.
źródło
źródło
Miałem podobny problem, próbując dodać element na początku istniejącej tablicy, przesunąć istniejące elementy w prawo i odrzucić najstarszy (tablica [length-1]). Moje rozwiązanie może nie być bardzo wydajne, ale działa w moich celach.
Powodzenia
źródło