Java ArrayList如何在开头添加元素


192

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

有没有人有什么建议?


你是说喜欢removeadd
彼得·劳瑞

arraylist stack queue whatever最好避免将您使用的内容添加到数组的开头,这听起来像您应该使用其他集合。
彼得·劳瑞

首先,你应该自己做点什么。到目前为止你做了什么?
Yegoshin Maxim

Answers:


311

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

10
我不会碰任何十英尺高的apache库,尤其是因为存在番石榴的收集类。番石榴的EvictingQueue在这里可能是一个不错的选择。
DPM

27

使用特定的数据结构

有多种数据结构已针对在第一个索引处添加元素进行了优化。请注意,如果将您的收藏转换为其中之一,则对话可能会需要时间和空间上的复杂性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速查表

倒转清单

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

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

如果您使用Java 8流,那么您可能会对此答案感兴趣。

分析

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

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


两次反转列表。与上述公认的解决方案相比,它会大大增加算法的运行时间吗?
Samyak Upadhyay'7

它加了2n,所以是的,但是,如果您的列表小于50,则您将无法对大多数现代机器上的差异进行微基准测试
Patrick Favre

8

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

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

添加后,您可以检查ArrayList的大小并在末尾删除它们。


4

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


1
我很惊讶您是谈论Deque的唯一答案,这显然是最佳的最佳解决方案。
Guillaume F.

3

您所描述的是适合使用的情况 Queue

既然要add新元素,remove又要旧元素。您可以在末尾添加,也可以从开头删除。那不会有太大的区别。

Queue有方法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`

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


1

我认为该工具应该很简单,但是考虑到效率,您应该使用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);
        }
    }
}


0

您可以使用此代码

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

0

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

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

-1

您可以使用

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

}

用您的数据类型更改E

如果需要删除最旧的元素,则可以添加:

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

在返回语句之前。否则,列表将在开始时添加您的对象,并保留最旧的元素。

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


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

-1

举这个例子:

List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);

-2

我有一个类似的问题,尝试在现有数组的开头添加一个元素,将现有元素向右移动,并丢弃最旧的元素(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

祝好运

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.