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

有人有什么建议吗?


当前回答

带FIFO规则的有界循环缓冲区

看来您需要一个容量有限的循环缓冲区。 您更喜欢类似数组的行为,而不喜欢链接队列。 我说的对吗? 您似乎需要将容量设置为“10”。 这可以通过有界结构实现。 你似乎也需要一个先进先出的纪律。

使用ArrayBlockingQueue的解决方案

一个由数组支持的有界阻塞队列…排序元素FIFO(先进先出)。队列的头是在队列上停留时间最长的元素。队列的尾部是在队列上停留时间最短的元素。在队列尾部插入新元素,队列检索操作获取队列头部的元素。 放,拿都挡。提议,投票不阻拦。

PriorityBlockingQueue

你可以看看PriorityBlockingQueue的文档。有一个类的例子,它“对可比元素应用先进先出的绑定打破”。

ArrayBlockingQueue的示例

ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

for (int i = 10; i < 30; i++) {
    if (queue.remainingCapacity() > 0) {
        queue.offer(i);
    } else {
        queue.poll();
        queue.offer(i);
    }
    if (queue.size() > 9) {
        System.out.println(queue);
    }
}

其他回答

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

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

list.add(0, yourObject);

然后你可以删除最后一个元素:

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

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

EDIT

也许可以看看Apache的CircularFifoQueue:

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

用你的最大大小初始化它:

CircularFifoQueue queue = new CircularFifoQueue(10);

带FIFO规则的有界循环缓冲区

看来您需要一个容量有限的循环缓冲区。 您更喜欢类似数组的行为,而不喜欢链接队列。 我说的对吗? 您似乎需要将容量设置为“10”。 这可以通过有界结构实现。 你似乎也需要一个先进先出的纪律。

使用ArrayBlockingQueue的解决方案

一个由数组支持的有界阻塞队列…排序元素FIFO(先进先出)。队列的头是在队列上停留时间最长的元素。队列的尾部是在队列上停留时间最短的元素。在队列尾部插入新元素,队列检索操作获取队列头部的元素。 放,拿都挡。提议,投票不阻拦。

PriorityBlockingQueue

你可以看看PriorityBlockingQueue的文档。有一个类的例子,它“对可比元素应用先进先出的绑定打破”。

ArrayBlockingQueue的示例

ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

for (int i = 10; i < 30; i++) {
    if (queue.remainingCapacity() > 0) {
        queue.offer(i);
    } else {
        queue.poll();
        queue.offer(i);
    }
    if (queue.size() > 9) {
        System.out.println(queue);
    }
}
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));
    }
}
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);
 }
}