繁体   English   中英

Java ArrayList 如何在开头添加元素

[英]Java ArrayList how to add elements at the beginning

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

有没有人有什么建议?

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

使用特定的数据结构

有多种数据结构针对在第一个索引处添加元素进行了优化。 但是请注意,如果您将您的收藏转换为其中之一,则对话可能需要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)因此仅适用于非常小的列表。

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

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

添加后,您可以检查 ArrayList 的大小并删除最后的那些。

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

您所描述的是使用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`

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

我认为实现应该很容易,但考虑到效率,您应该使用 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);
        }
    }
}

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

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

你可以使用这个代码

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

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

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

您可以使用

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

}

使用您的数据类型更改 E

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

list.remove(list.size()-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);
 }
}
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));
    }
}

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

祝你好运

拿这个例子:-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM