我很好奇 Scala 是否在它的集合类中隐藏了一些我可以使用的 gem 。基本上我正在寻找类似 FIFO 队列的东西,但是它的大小有一个上限,这样当达到限制时,最旧的(第一个)元素就会从队列中删除。过去我自己在 Java 中实现了这一点,但如果可能的话,我宁愿使用一些标准的东西。
最佳答案
子类化通常更可取的替代方法是(不幸的是)“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)
每当
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)
这种方法优于子类化的优点是
enqueueFinite
所有人都可以使用Queue
s,包括那些通过 enqueue
等操作构造的, map
, ++
, ETC。更新 :正如 Dylan 在评论中所说,
enqueueFinite
还需要获取最大队列大小的参数,并根据需要删除元素。我更新了代码。
关于scala - scala队列的最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918731/