1

次の特性を持つ Ruby データ構造を探しており、自分で作成する必要がないことを望んでいます。

  1. 先入れ先出し (キュー)
  2. 最大長を指定できます
  3. キューが容量に達すると、新しいアイテムがプッシュされ、最も古いアイテムが破棄されます。

私はSizedQueueが仕事をしたかもしれないと思ったが、最大長に達するとプッシュをブロックするため、基準 #3 を満たしていない。

手入れの行き届いた図書館でそのような獣を知っている人はいますか?

ありがとう。

4

3 に答える 3

3

循環キューまたはリング バッファーを探しているようです。

cbufferは近いですが、使用可能なスペースを超えるとスローされます。

サンプル コードとして他のいくつかの実装を見つけましたが、現時点ではまだ gem としてパッケージ化されていません。1 つは、この RingBuffer スニペットです。これはおそらくかなり最小限の実装であり、おそらく少し作業が必要です。

この場所には、RingBuffer のかなり完全な実装が含まれているようです。

于 2012-04-24T01:38:27.510 に答える
1

JasonTrue の回答の最後の 2 つのリンクは現在無効になっていますが、ここで (おそらく同じ) RingBuffer スニペットを見つけました: https://gist.github.com/eerohele/1904422

于 2014-03-19T22:25:54.803 に答える
1

これを試すことができます 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]
于 2019-01-15T21:37:21.213 に答える