如果我遇到以下问题,我想知道应该使用哪种数据结构(队列):
这样做的目的是使用固定宽度的数据源,图形将扫描该数据源以绘制其曲线。
编辑:此图表旨在显示在Android自定义视图中。是否有一个我可以使用的特定长度,这将使循环更快?
EDIT2:添加“当添加新值时,如果队列已满,则第一个被删除 。如果我将30个新值添加到完整队列, 30首先被自动删除。“
答案 0 :(得分:4)
如果堆栈的容量永远不会改变,我会使用一个数组。我会跟踪“第一个”节点的位置并保持包裹它。
我还想指出,你的行为看起来更像是一个队列而不是一个堆栈。你确定堆栈是你想要的吗?
class RotatingQueue<E> {
Object[] data; // can't do E[]
final int maxSize;
int size = 0; // starts empty
int first = 0; // starts at the front, why not?
RotatingQueue(int size) {
this.maxSize = size;
data = new Object[size];
}
E add(E e) {
E old = (E)(data[first]);
old[first++] = e;
if(size < maxSize) size++;
return old;
}
}
答案 1 :(得分:1)
您肯定需要一个基于Circular buffer阵列的队列,并具有模块化访问权限。您可以轻松修改实现以删除第一个元素,而不是抛出异常。
答案 2 :(得分:0)
请参阅ArrayBlockingQueue:http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ArrayBlockingQueue.html
答案 3 :(得分:0)
我建议将LinkedHashSet用于唯一项目或ArrayList。
答案 4 :(得分:0)
听起来你需要...... a stack!
不,我只是在开玩笑。 “堆栈”在这里并不是一个正确的术语,因为堆栈是“后进先出”,这意味着您将内容添加到顶部,然后以相反的顺序将其取出。
您真正需要的是Deque实施。这是一个允许在两端插入和删除的队列。我假设当队列变满时只需要删除值。您的描述并未完全清楚。如果你在插入新值时总是丢弃值,那么你最终会得到一个只有一个元素的数据结构。
我不知道自动限制项目数量的实现。 ArrayDeque非常接近,但您仍需要检查插入的大小并从一开始就删除多余的元素。它提供了典型的iterator
Java集合方法,允许您循环遍历项目。对于此类型的集合,订单是有保证的。