scala - scala队列的最大长度

标签 scala scala-collections

我很好奇 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/

相关文章:

scala - 我应该在 Spark sql 中使用哪一个来获得更好的性能,是从 Parquet 文件读取数据还是从数据库读取数据?

scala - 更干净的元组 groupBy

Scala:不可变的 Set 和不可变的 Map 键是否变得协变?

scala - 如何在 Scala 中对可变长度的重复序列进行分组

scala - 有没有办法在 Scala 中创建通用类型的实例而不是反射

scala - 模拟解析器连接的无形 HList 提取器 `~`

algorithm - 图问题的函数/流编程 "Reconstruct Itinerary"

java - 在Scala play框架中处理xml

generics - Scala 中泛型集合的问题

scala - scala.Array 如何是 Seq?