【问题标题】:Ruby Data Structure - Queue with MaximumRuby 数据结构 - 最大队列
【发布时间】:2024-01-02 23:26:01
【问题描述】:

我正在寻找具有以下特征的 Ruby 数据结构,并且希望不必自己动手:

  1. 先进先出(即队列)
  2. 允许指定最大长度
  3. 当队列达到容量时,新项目被推入,最旧的项目被丢弃。

我认为 SizedQueue 可能已经完成了这项工作,但它不满足标准 #3,因为它会在达到最大长度时阻止推送。

有人知道在维护良好的图书馆里有这样的野兽吗?

谢谢。

【问题讨论】:

    标签: ruby data-structures


    【解决方案1】:

    听起来您正在寻找循环队列或环形缓冲区。

    cbuffer 已关闭,但如果超出可用空间仍会抛出。

    我发现了一些其他实现作为示例代码,但到目前为止,还没有打包为 gem。一个是this RingBuffer snippet。这可能是一个相当简约的实现,可能需要做一些工作。

    This location 似乎包含一个相当完整的 RingBuffer 实现。

    【讨论】:

    • 感谢您给我两个新的搜索词 :-)
    • “循环数组”是我的一位同事在很久以前使用的另一个术语,尤其是当目的(例如,堆栈与队列)不够具体时。
    【解决方案2】:

    JasonTrue 答案中的最后两个链接现在已经失效,但我在这里找到了(可能相同的)RingBuffer sn-p:https://gist.github.com/eerohele/1904422

    【讨论】:

      【解决方案3】:

      你可以试试这个https://gist.github.com/julik/a4c0b88abc17922f4f2a1a01a6bba530

      像这样使用它:

      ring = Ring.new(4)
      ring.pos #=> 0
      ring << :a # fills first element
      ring.pos #=> 1
      ring << :b << :c << :d # fills the rest
      ring.to_a # [:a, :b, :c, :d] - Array of elements from the current position
      ring.next #=> :a 
      ring.to_a # [:b, :c, :d, :e] - Position shifted
      ring << :z #=> overwrites :b and advances position
      ring.to_a #=> [:c, :d, :a, :z]
      

      【讨论】: