Java Arrays如何在开头添加元素

ZeD*_*ino 156 java arrays stack arraylist

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

有没有人有什么建议?

Baz*_*Baz 265

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

list.add(0, yourObject);
Run Code Online (Sandbox Code Playgroud)

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

if(list.size() > 10)
    list.remove(list.size() - 1);
Run Code Online (Sandbox Code Playgroud)

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

编辑

也许看看Apache的CircularFifoQueue:

CircularFifoQueue 是一个先进先出队列,具有固定大小,如果已满,则替换其最旧的元素.

只需用最大尺寸初始化它:

CircularFifoQueue queue = new CircularFifoQueue(10);
Run Code Online (Sandbox Code Playgroud)

  • 我不会碰到任何带有十英尺杆的apache库,特别是因为番石榴的收集类存在.番石榴的EvictingQueue可能是一个不错的选择. (9认同)

pat*_*ckf 24

使用特定数据结构

存在各种数据结构,这些数据结构被优化用于在第一索引处添加元素.但请注意,如果您将您的收藏转换为其中之一,那么对话可能需要时间和空间的复杂性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"
Run Code Online (Sandbox Code Playgroud)

分析

插入的空间和时间复杂度是使用LinkedListconstant(O(1)).请参阅Big-O备忘单.

扭转名单

一种非常简单但效率低下的方法是使用reverse:

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);
Run Code Online (Sandbox Code Playgroud)

如果您使用Java 8流,这个答案可能会让您感兴趣.

分析

  • 时间复杂性: O(n)
  • 空间复杂性: O(1)

查看JDK实现,这具有O(n)时间复杂性,因此仅适用于非常小的列表.


npi*_*nti 8

你可以看一下add(int index,E element):

将指定元素插入此列表中的指定位置.将当前位于该位置的元素(如果有)和任何后续元素向右移动(向其索引添加一个元素).

添加后,您可以检查ArrayList的大小并删除末尾的大小.


Evv*_*vvo 5

您可能需要看看Deque。它使您可以直接访问列表中的第一项和最后一项。