当有Vector时,线性序列List的需要是什么?

时间:2017-02-01 17:42:41

标签: scala collections

向量是不可变的,索引的,支持随机访问,在Scala中高效;什么是不可变线性序列的需要列表

3 个答案:

答案 0 :(得分:4)

列表是一种非常常见的数据结构,如果它不存在则会很奇怪。

使用prepend,head和tail操作列表更好

与vector

相比,List的开销更少

如果您不需要随机访问,只关心头/尾操作列表是有意义的。如果你确实需要随机访问,那么Vector或其他一些数据结构更有意义。

答案 1 :(得分:1)

Haoyi Li比较Scala系列有一个非常有趣的Blog。我向任何人推荐这个。

有一节明确比较了Lists vs Vectors

总体而言,列表和向量具有完全不同的特征

  • 与Vector相比,列表占用的空间增加了一倍。因此,如果您有数百万个元素,那么Vector就是您的选择。
  • 对矢量的随机访问实际上是O(1)和列表O(n)。
  • 通过在当时附加一个元素来增长向量是缓慢的,非常慢。列表的速度要快一个数量级。
  • 顺序扫描列表和矢量具有相同的速度。

答案 2 :(得分:0)

除了@marios和@puhlen已经提到的内容之外,使用传统列表(头/尾)的另一个原因是模式匹配。有两个类可以帮助解决这个问题。

首先是::(cons)案例类:

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}

其次,有一个Nil案例类:

case object Nil extends List[Nothing] { 
  ...
}

(正如您可以看到这些都适用于List类型)

这些使列表上的模式匹配非常自然:

list match {
  case Nil => "empty list"
  case x :: xs => s"head is $x with tail $xs"
}