scala队列的最大长度

Joh*_*n S 15 scala scala-collections

我很好奇Scala是否在我可以使用的集合类中隐藏了一些gem.基本上我正在寻找类似FIFO队列的东西,但是它的大小有一个上限,这样当命中限制时,最旧的(第一个)元素将从队列中删除.我以前用Java自己实现了这个,但如果可能的话,我宁愿使用标准的东西.

Kip*_*ros 20

子类化的一个常见的替代方法是(不幸的是命名)" pimp my library "模式.您可以使用它来添加enqueueFinite方法Queue,如下所示:

import scala.collection.immutable.Queue
class FiniteQueue[A](q: Queue[A]) {
  def enqueueFinite[B >: A](elem: B, maxSize: Int): Queue[B] = {
    var ret = q.enqueue(elem)
    while (ret.size > maxSize) { ret = ret.dequeue._2 }
    ret
  }
}
implicit def queue2finitequeue[A](q: Queue[A]) = new FiniteQueue[A](q)
Run Code Online (Sandbox Code Playgroud)

无论何时queue2finitequeue在范围内,您都可以将Queue对象视为具有以下enqueueFinite方法:

val maxSize = 3
val q1 = Queue(1, 2, 3)
val q2 = q1.enqueueFinite(5, maxSize)
val q3 = q2.map(_+1)
val q4 = q3.enqueueFinite(7, maxSize)
Run Code Online (Sandbox Code Playgroud)

这种方法在子类中的优点是enqueueFinite适用于所有QueueS,包括那些通过类似操作构成enqueue,map,++,等.

更新:正如Dylan在评论中所说,enqueueFinite还需要为最大队列大小获取参数,并根据需要删除元素.我更新了代码.