使用什么样的数据结构(固定长度)?

时间:2011-10-31 21:08:12

标签: java data-structures

如果我遇到以下问题,我想知道应该使用哪种数据结构(队列):

  • 队列必须具有动态分配的长度(例如,512)。
  • 每个新值都保存在队列末尾。
  • 添加新值时,如果队列已满,则删除第一个值。如果我向完整队列添加30个新值,则会先自动删除30个。
  • 存储的数据类型是数组或其他一些简单对象。
  • 我需要能够使用循环快速检索值,始终按顺序(无随机访问)。

这样做的目的是使用固定宽度的数据源,图形将扫描该数据源以绘制其曲线。

编辑:此图表旨在显示在Android自定义视图中。是否有一个我可以使用的特定长度,这将使循环更快?

EDIT2:添加“当添加新值时,如果队列已满,则第一个被删除 。如果我将30个新值添加到完整队列, 30首先被自动删除。“

5 个答案:

答案 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)

答案 3 :(得分:0)

我建议将LinkedHashSet用于唯一项目或ArrayList。

答案 4 :(得分:0)

听起来你需要...... a stack

不,我只是在开玩笑。 “堆栈”在这里并不是一个正确的术语,因为堆栈是“后进先出”,这意味着您将内容添加到顶部,然后以相反的顺序将其取出。

您真正需要的是Deque实施。这是一个允许在两端插入和删除的队列。我假设当队列变满时只需要删除值。您的描述并未完全清楚。如果你在插入新值时总是丢弃值,那么你最终会得到一个只有一个元素的数据结构。

我不知道自动限制项目数量的实现。 ArrayDeque非常接近,但您仍需要检查插入的大小并从一开始就删除多余的元素。它提供了典型的iterator Java集合方法,允许您循环遍历项目。对于此类型的集合,订单是有保证的。