Мне нужно добавить элементы в ArrayList
очередь как угодно, но когда я вызываю функцию для добавления элемента, я хочу, чтобы он добавил элемент в начале массива (поэтому он имеет самый низкий индекс), и если массив имеет добавление 10 элементов новый результат удаляет самый старый элемент (тот, который имеет самый высокий индекс).
У кого-нибудь есть предложения?
remove
иadd
?arraylist stack queue whatever
Лучше избегать того, что вы используете как добавление в начало массива, и похоже, что вы должны использовать другую коллекцию.Ответы:
List
имеет методadd(int, E)
, так что вы можете использовать:После этого вы можете удалить последний элемент с помощью:
Однако вы можете пересмотреть свои требования или использовать другую структуру данных, например
Queue
РЕДАКТИРОВАТЬ
Может быть, посмотрите на Apache
CircularFifoQueue
:Просто инициализируйте его с максимальным размером:
источник
Использование конкретных структур данных
Существуют различные структуры данных, которые оптимизированы для добавления элементов в первый индекс. Имейте в виду, что если вы преобразуете свою коллекцию в одну из них, беседе, вероятно, потребуется временная и пространственная сложность
O(n)
Deque
JDK включает в себя
Deque
структуру, которая предлагает такие методы, какaddFirst(e)
иofferFirst(e)
Анализ
Пространственно-временная сложность вставки с помощью
LinkedList
константы (O(1)
). Смотрите Big-O шпаргалку .Перевернуть список
Очень простой, но неэффективный метод - использовать реверс:
Если вы используете потоки Java 8, этот ответ может вас заинтересовать.
Анализ
O(n)
O(1)
Глядя на реализацию JDK, это имеет
O(n)
временную сложность, поэтому подходит только для очень маленьких списков.источник
Вы можете взглянуть на add (int index, E element) :
После добавления вы можете проверить размер ArrayList и удалить его в конце.
источник
Вы можете посмотреть на Deque. это дает вам прямой доступ к первым и последним элементам в списке.
источник
То, что вы описываете, является подходящей ситуацией для использования
Queue
.Так как хочется
add
нового элемента иremove
старого. Вы можете добавить в конце и удалить с начала. Это не будет иметь большого значения.Очередь имеет методы
add(e)
иremove()
который добавляет в конце новый элемент, и удаляет с самого начала старого элемента, соответственно.Таким образом, каждый раз, когда вы добавляете элемент в,
queue
вы можете создать его резервную копию с помощьюremove
вызова метода.ОБНОВЛЕНИЕ : -
И если вы хотите исправить размер
Queue
, то вы можете взглянуть на: -ApacheCommons#CircularFifoBuffer
Из
documentation
: -Как видите, при достижении максимального размера добавление нового элемента автоматически удаляет первый вставленный элемент.
источник
Я думаю, что реализация должна быть простой, но учитывая эффективность, вы должны использовать LinkedList, а не ArrayList в качестве контейнера. Вы можете обратиться к следующему коду:
источник
Java LinkedList предоставляет как метод addFirst (E e), так и метод push (E e), который добавляет элемент в начало списка.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
источник
Вы можете использовать этот код
источник
Вы можете использовать методы списка, удалить и добавить
источник
Возьмите этот пример:
источник
Ты можешь использовать
Изменить E с вашим типом данных
Если необходимо удалить самый старый элемент, вы можете добавить:
до возврата заявления. В противном случае список добавит ваш объект в начале, а также сохранит самый старый элемент.
Это удалит последний элемент в списке.
источник
источник
У меня была похожая проблема: я пытался добавить элемент в начале существующего массива, сдвинуть существующие элементы вправо и отбросить самый старый (массив [длина-1]). Мое решение может быть не очень эффективным, но оно работает для моих целей.
Удачи
источник