Java массивы как добавить элементы в начале
Мне нужно добавить элементы в ArrayList
очередь, но когда я вызываю функцию для добавления элемента, я хочу, чтобы она добавила элемент в начале массива (поэтому он имеет самый низкий индекс), и если массив имеет 10 элементов, добавляющих новые результаты в удалении самого старого элемента (тот, у которого самый высокий индекс).
есть ли у кого-нибудь предложения?
12 ответов
List
имеет способ add(int, E)
, так что вы можете использовать:
list.add(0, yourObject);
после этого вы можете удалить последний элемент, с:
if(list.size() > 10)
list.remove(list.size() - 1);
однако вы можете пересмотреть свои требования или использовать другую структуру данных, например Queue
редактировать
возможно, посмотрите на Apache CircularFifoQueue
:
CircularFifoQueue
-это в первую очередь с фиксированный размер, который заменяет его самый старый элемент, если полный.
просто инициализируйте его с максимальным размером:
CircularFifoQueue queue = new CircularFifoQueue(10);
Использование Конкретных Datastructures
существуют различные структуры данных, оптимизированные для добавления элементов в первый индекс. Однако имейте в виду, что если вы конвертируете свою коллекцию в одну из них, разговор, вероятно, потребуется сложность времени и пространства O(n)
очереди
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)
сложность времени, поэтому подходит только для очень небольших списков.
вы можете взглянуть на add (int index, e element):
вставляет указанный элемент в указанной позиции в этом списке. Смещает элемент в настоящее время в этом положении (если есть) и все последующие элементы справа (добавляет один к их индексам).
после добавления вы можете проверить размер 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 добавит ваш объект в начале, а также сохранит самый старый элемент.
это удалит последний элемент в списке.
вы можете использовать методы списка, удалить и добавить
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);
}
}