我需要向ArrayList
队列添加元素,但是当我调用函数添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引)如果数组有10个元素,则在删除最旧元素(索引最高的元素)时添加新结果。
有人有任何建议吗?
答案 0 :(得分:244)
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);
答案 1 :(得分:21)
有各种数据结构针对在第一个索引处添加元素进行了优化。但请注意,如果您将收藏集转换为其中之一,则会话可能需要时间和空间复杂度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);
If you use Java 8 streams, this answer might interest you.
O(n)
O(1)
查看JDK implementation这有O(n)
时间复杂度,因此仅适用于非常小的列表。
答案 2 :(得分:8)
您可以查看add(int index, E element):
将指定元素插入此列表中的指定位置。 移动当前位于该位置的元素(如果有)和任何元素 右边的后续元素(在索引中加一个)。
添加后,您可以检查ArrayList的大小并删除最后的那些。
答案 3 :(得分:5)
你可能想看看Deque。它使您可以直接访问列表中的第一个和最后一个项目。
答案 4 :(得分:4)
您所描述的是使用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`
如您所见,当达到最大尺寸时,添加新元素会自动删除插入的第一个元素。
答案 5 :(得分:2)
我认为该工具应该很简单,但考虑到效率,您应该使用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);
}
}
}
答案 6 :(得分:2)
Java LinkedList提供了addFirst(E e)和push(E e)方法,它们将元素添加到列表的前面。
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
答案 7 :(得分:1)
您可以使用此代码
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);
}
}
答案 8 :(得分:0)
您可以使用
public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;
}
使用您的数据类型
更改E.如果需要删除最旧的元素,则可以添加:
list.remove(list.size()-1);
这将删除列表中的最后一个元素。
答案 9 :(得分:0)
您可以使用列表方法,删除并添加
list.add(lowestIndex, element);
list.remove(highestIndex, element);
答案 10 :(得分:0)
我遇到了类似的问题,尝试在现有数组的开头添加元素,将现有元素向右移动并丢弃最旧的元素(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
祝你好运
答案 11 :(得分:0)
var start_date = new Date();
var end_date = new Date(2018,09,30);
答案 12 :(得分:0)
import com.google.common.collect.Lists;
import java.util.List;
/**
* @author Ciccotta Andrea on 06/11/2020.
*/
public class CollectionUtils {
/**
* It models the prepend O(1), used against the common append/add O(n)
* @param head first element of the list
* @param body rest of the elements of the list
* @return new list (with different memory-reference) made by [head, ...body]
*/
public static <E> List<Object> prepend(final E head, List<E> final body){
return Lists.asList(head, body.toArray());
}
/**
* it models the typed version of prepend(E head, List<E> body)
* @param type the array into which the elements of this list are to be stored
*/
public static <E> List<E> prepend(final E head, List<E> body, final E[] type){
return Lists.asList(head, body.toArray(type));
}
}
答案 13 :(得分:-1)
以这个例子为例:-
List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);