如何在Scala中实现固定大小的List?

时间:2011-08-15 03:31:42

标签: scala

例如,假设我想要一个包含0到最多1000个元素的列表。在此之上,应首先丢弃最旧的插入。集合本身是否支持此功能?如果不是,我将如何进行实施?我知道列表中的某些操作非常慢,所以我可能需要不同的数据类型吗?

查看元素不应该影响列表。我只想插入和调整操作。

4 个答案:

答案 0 :(得分:9)

这是我的第一个传递实现,以防其他人发现它有用

import scala.collection._
import mutable.ListBuffer

class FixedList[A](max: Int) extends Traversable[A] {

  val list: ListBuffer[A] = ListBuffer()

  def append(elem: A) {
    if (list.size == max) {
      list.trimStart(1)
    }
    list.append(elem)
  }

  def foreach[U](f: A => U) = list.foreach(f)

}

答案 1 :(得分:7)

听起来你想要一个大小有限的队列。这是一个类似的问题:Maximum Length for scala queue

该问题提出了三种解决方案。你可以,

  1. 从头开始编写队列(范例为此提供代码),
  2. 通过子类化或
  3. 扩展Scala的Queue实现
  4. 使用类型类扩展模式(又名“pimp my library”)来扩展Scala的Queue

答案 2 :(得分:1)

循环数组是最快的实现。它基本上是一个带有读写索引的数组,它们在到达数组末尾时被包装。大小定义为:

def size = writeIndex - readIndex + (if (readIndex > writeIndex) array.size else 0)

答案 3 :(得分:0)

虽然没有回答问题的详细信息(但确实回答了问题的标题),但是List.fill(1000){0}会创建一个长度为1000的List,其初始值为0,这是从

Scala - creating a type parametrized array of specified length