Java массивы как добавить элементы в начале
Мне нужно добавить элементы в ArrayList очередь что угодно, но когда я вызываю функцию, чтобы добавить элемент, я хочу, чтобы он добавил элемент в начале массива (так что он имеет самый низкий индекс), и если массив имеет 10 элементов, добавляющих новые результаты в удалении самого старого элемента (тот, у которого самый высокий индекс).
есть ли у кого-нибудь предложения?
12 ответов:
Listимеет способadd(int, E), так что вы можете использовать:list.add(0, yourObject);после этого вы можете удалить последний элемент, с:
if(list.size() > 10) list.remove(list.size() - 1);тем не менее, вы можете пересмотреть свои требования или использовать другую структуру данных, например
QueueEDIT
может быть, взгляните на Apache
CircularFifoQueue:
CircularFifoQueue-это в первую очередь с фиксированный размер, который заменяет его самый старый элемент, если он заполнен.просто инициализировать его с вами максимальный размер:
CircularFifoQueue queue = new CircularFifoQueue(10);
Использование Конкретных Структур
существуют различные структуры данных, которые оптимизированы для добавления элементов в первого индекса. Однако имейте в виду, что если вы преобразуете свою коллекцию в одну из них, разговор, вероятно, потребует временной и пространственной сложности
O(n)Deque
JDK включает в себя
Dequeструктура, которая предлагает такие методы, какaddFirst(e)иofferFirst(e)Deque<String> deque = new LinkedList<>(); deque.add("two"); deque.add("one"); deque.addFirst("three"); //prints "three", "two", "one"анализ
пространственно-временная сложность вставки с
LinkedListконстанта (O(1)). Смотрите Big-O cheatsheet.реверсирование списка
очень простой, но неэффективный метод заключается в использовании обратного:
Collections.reverse(list); list.add(elementForTop); Collections.reverse(list);если вы используете потоки Java 8, этот ответ может вас заинтересовать.
анализ
- Сложность :
O(n)- Космос Сложность:
O(1)смотреть на!--48-->реализация JDK это
O(n)сложность времени так подходит только для очень маленьких списков.
вы можете взглянуть на добавить (индекс int, элемент E):
вставляет указанный элемент в указанную позицию в этом списке. Смещает элемент в настоящее время в этом положении (если есть) и все последующие элементы справа (добавляет один к их индексам).
после добавления вы можете проверить размер ArrayList и удалить те, в конце.
вы можете посмотреть на очереди. это дает вам прямой доступ к первому и последнему элементу в списке.
то, что вы описываете, является подходящей ситуацией для использования
Queue.так как вы хотите
addновый элемент, аremoveстарый. Вы можете добавить в конце, и удалить с самого начала. Это не будет иметь большого значения.очередь имеет методы
add(e)иremove()который добавляет в конце новый элемент, и удаляет из начала старый элемент, соответственно.Queue<Integer> queue = new LinkedList<Integer>(); queue.add(5); queue.add(6); queue.remove(); // Remove 5Итак, каждый раз, когда вы добавить элемент для
queueвы можете создать резервную копию сremoveвызов метода.
обновление: -
и если вы хотите чтобы исправить размер
Queue, то вы можете взглянуть на: -ApacheCommons#CircularFifoBufferС
documentation: -CircularFifoBuffer является первым в первом из буфера с фиксированным размером это заменяет его самый старый элемент, если полный.
Buffer queue = new CircularFifoBuffer(2); // Max size queue.add(5); queue.add(6); queue.add(7); // Automatically removes the first element `5`как вы можете видеть, когда максимальный размер достигнут, то добавление нового элемента автоматически удаляет первый вставленный элемент.
Я думаю, что реализация должна быть простой, но учитывая эффективность, Вы должны использовать LinkedList, но не ArrayList в качестве контейнера. Вы можете обратиться к следующему коду:
import java.util.LinkedList; import java.util.List; public class DataContainer { private List<Integer> list; int length = 10; public void addDataToArrayList(int data){ list.add(0, data); if(list.size()>10){ list.remove(length); } } public static void main(String[] args) { DataContainer comp = new DataContainer(); comp.list = new LinkedList<Integer>(); int cycleCount = 100000000; for(int i = 0; i < cycleCount; i ++){ comp.addDataToArrayList(i); } } }
Java LinkedList предоставляет как метод addFirst(E e), так и метод push (E e), который добавляет элемент в начало списка.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
вы можете использовать этот код
private List myList = new ArrayList(); private void addItemToList(Object obj){ if(myList.size()<10){ myList.add(0,obj); }else{ myList.add(0,obj); myList.remove(10); } }
можно использовать
public List<E> addToListStart(List<E> list, E obj){ list.add(0,obj); return (List<E>)list; }изменить E с вашим типом данных
Если удаление самого старого элемента необходимо, то вы можете добавить:
list.remove(list.size()-1);перед оператором возврата. В противном случае список добавит ваш объект в начале, а также сохранит самый старый элемент.
это приведет к удалению последнего элемента в списке.
вы можете использовать методы списка, удалить и добавить
list.add(lowestIndex, element); list.remove(highestIndex, element);
У меня была аналогичная проблема, пытаясь добавить элемент в начале существующего массива, сдвинуть существующие элементы вправо и отбросить самый старый (array[length-1]). Мое решение может быть не очень эффективным, но оно работает для моих целей.
Method: updateArray (Element to insert) - for all the elements of the Array - start from the end and replace with the one on the left; - Array [0] <- Elementудачи
import java.util.*: public class Logic { List<String> list = new ArrayList<String>(); public static void main(String...args) { Scanner input = new Scanner(System.in); Logic obj = new Logic(); for (int i=0;i<=20;i++) { String string = input.nextLine(); obj.myLogic(string); obj.printList(); } } public void myLogic(String strObj) { if (this.list.size()>=10) { this.list.remove(this.list.size()-1); } else { list.add(strObj); } } public void printList() { System.out.print(this.list); } }
Comments