【问题标题】:What kind of data structure to use (fixed length)?使用什么样的数据结构(固定长度)?
【发布时间】:2011-12-19 01:48:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 是否存在一些限制,你永远不会,甚至暂时不会超过堆栈大小?否则地图呢?只需适当地添加和删除?
  • @Randy 地图没有顺序。也许是链接的哈希集,但同样不需要随机访问。

标签: java data-structures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 不,我不是,事实上我不应该使用这个词。
    • @AntoineG 我添加了一个草稿,以防您无法使用 Java 的集合。它远未完成,但它应该让您了解结构必须做什么以及如何做。
    • 谢谢,我会用这个策略的。
    【解决方案3】:

    听起来你需要...a stack

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

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

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

    【讨论】:

      【解决方案4】:

      我会推荐 LinkedHashSet 用于唯一项或 ArrayList。

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 2016-02-16
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        相关资源
        最近更新 更多