我想要一个固定大小的数据结构,并将作为FIFO工作。我的意思是如果 size 超过第一个元素将被删除。在每次插入之后,我想检查该结构的中间元素(即大小为21的第10个元素)
我考虑使用ArrayDeque但是Deque接口不考虑顺序。即获得第i个元素)
我会将它用于耗时的过程,性能对我来说很重要。为了我的目的,建议的数据结构是什么?
答案 0 :(得分:1)
让我们假设我们正在讨论通常包含大量元素的FIFO。
ArrayList不是一个好选择,因为删除列表开头的元素是O(N)
操作。 (对于包含N个元素的列表)
LinkedList 可能不是一个好选择,因为获取第N个元素是O(N)
操作。
我认为你需要一个由数组支持的循环缓冲区。从FIFO开始,这将为您提供O(1)
FIFO插入,O(1)
FIFO移除以及元素O(1)
的{{1}}索引get
。使用两个索引来实现循环缓冲行为,一个用于队列开始的位置,一个用于结束的位置。插入和删除只涉及移动一个或另一个索引,i
归结为get(i)
的提取并进行一些错误检查。
如果您需要FIFO可扩展,您可以通过将后备阵列的大小加倍来实现这一点......并且仍然可以分摊backingArray[(startPos + i) % backingArray.length]
以进行插入,删除和索引。
我认为Apache Commons CircularFifoQueue
类符合您对固定大小FIFO情况的要求。它包含一个O(1)
方法来获取第i个元素。
答案 1 :(得分:0)
您可以使用LinkedList
。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html
LinkedList实现队列接口(FIFO),但您也可以在队列中的特定位置获取项目
例如:
LinkedList<Object> queue = new LinkedList<Object>();
public void insertObject(Object o)
{
int middleElement = queue.size/2;
if(queue.size > 20) //If full
{
queue.Poll(); //remove the first element
queue.Offer(o); //Adds the element
print(queue.Get(middleElement)); //Print the middle element
}
else //If not full
{
queue.Offer(o); //Adds the element
print(queue.Get(middleElement)); //Print the middle element
}
}