我需要将元素添加到ArrayList
队列中,但是当我调用函数添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引),并且如果数组有10个元素添加一个新的结果将删除最旧的元素(具有最高索引的元素)。
有没有人有什么建议?
我需要将元素添加到ArrayList
队列中,但是当我调用函数添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引),并且如果数组有10个元素添加一个新的结果将删除最旧的元素(具有最高索引的元素)。
有没有人有什么建议?
arraylist stack queue whatever
最好避免将您使用的内容添加到数组的开头,这听起来像您应该使用其他集合。
Answers:
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);
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)
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);
}
}
举这个例子:
List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);
remove
和add
?