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
祝你好运