Java数组如何在开始时添加元素

我需要将元素添加到ArrayList队列中,但是当我调用函数来添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引),并且如果数组有10个元素添加删除最旧元素(索引最高的元素)的新结果。

有没有人有什么build议?

List有方法add(int, E) ,所以你可以使用:

 list.add(0, yourObject); 

之后,您可以删除最后一个元素:

 if(list.size() > 10) list.remove(list.size() - 1); 

但是,您可能想要重新考虑您的需求,或使用不同的数据结构,如Queue

编辑

也许看看Apache的CircularFifoQueue

CircularFifoQueue是一个固定大小的先进先出队列,如果已满,它将replace其最早的元素。

只要初始化它与您的最大尺寸:

 CircularFifoQueue queue = new CircularFifoQueue(10); 

一个非常简单但效率低下的方法是使用反转

  Collections.reverse(list); list.add(elementForTop); Collections.reverse(list); 

从JDK的实现来看,这具有O(n)时间复杂度,因此只适用于非常小的列表。

如果你使用Java 8stream,这个答案可能会让你感兴趣。

你可以看看add(int index,E元素) :

将指定的元素插入此列表中的指定位置。 将当前位置的元素(如果有的话)和任何随后的元素移到右侧(在其索引中增加一个)。

一旦你添加,你可以检查ArrayList的大小,并删除最后的。

你可能想看看Deque。 它使您可以直接访问列表中的第一个和最后一个项目。

你所描述的,使用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是具有固定大小的先进先出缓冲区,如果已满则replace其最早的元素。

 Buffer queue = new CircularFifoBuffer(2); // Max size queue.add(5); queue.add(6); queue.add(7); // Automatically removes the first element `5` 

如您所见,当达到最大尺寸时,添加新元素会自动删除插入的第一个元素。

你可以使用这个代码

 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); } } 

我认为该工具应该很容易,但考虑效率,你应该使用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); } } } 

您可以使用

 public List<E> addToListStart(List<E> list, E obj){ list.add(0,obj); return (List<E>)list; } 

用你的数据types改变E.

如果删除最老的元素是必要的,那么你可以添加:

 list.remove(list.size()-1); 

之前返回声明。 否则,列表将在开始时添加对象,并保留最早的元素。

这将删除列表中的最后一个元素。

您可以使用列表方法,删除和添加

 list.add(lowestIndex, element); list.remove(highestIndex, element); 

Java LinkedList提供addFirst(E e)和push(E e)方法,将元素添加到列表的前面。

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E);

我有一个类似的问题,试图添加一个元素在一个现有的数组的开始,将现有的元素向右移动,并放弃最旧的一个(array [length-1])。 我的解决scheme可能不是非常高效,但它适用于我的目的。

  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 

祝你好运