繁体   English   中英

使用哪种数据结构(固定长度)?

[英]What kind of data structure to use (fixed length)?

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

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

这样做的目的是要有一个固定宽度的数据源,图形将对其进行扫描以绘制其曲线。

编辑:此图旨在显示在Android自定义视图上。 我可以使用特定的长度来使循环更快吗?

编辑2:添加了“添加新值时, 如果队列已满 ,则删除第一个值。如果我将30个新值添加到已满队列 ,则自动删除30个值。”

如果堆栈的容量永远不会改变,我将使用一个数组。 我将跟踪“第一个”节点的位置,并继续对其进行环绕。

我还想指出,您的行为似乎更像是队列而不是堆栈。 您确定堆栈是您想要的吗?

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;
    }

}

您绝对需要带有模块化访问权限的循环缓冲区 -基于数组的队列。 您可以轻松地修改实现以删除第一个元素,而不是引发异常。

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

听起来您需要... 一个堆栈

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

您真正需要的是Deque实现。 这是一个队列,允许在两端插入和删除。 我将假设仅在队列已满时才需要删除值。 您的描述并不清楚。 如果在插入新值时总是删除值,那么最终将得到一个数据结构,该数据结构在任何时候都只有一个元素。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM