【发布时间】:2017-02-01 17:42:41
【问题描述】:
Vector 是不可变的,索引的,支持随机访问,在 Scala 中高效;不可变线性序列List需要什么?
【问题讨论】:
标签: scala collections
Vector 是不可变的,索引的,支持随机访问,在 Scala 中高效;不可变线性序列List需要什么?
【问题讨论】:
标签: scala collections
列表是一种很常见的数据结构,如果不存在就很奇怪了。
列表最好有前置、头部和尾部操作
与向量相比,列表的开销更少
如果您不需要随机访问并且只关心头/尾操作,则 List 是有意义的。如果您确实需要随机访问,那么 Vector 或其他一些数据结构更有意义。
【讨论】:
Haoyi Li 有一个非常有趣的Blog 比较了 Scala 集合。我向任何人推荐这个。
有一段明确比较了Lists vs Vectors。
总的来说,Lists和Vectors有很大的不同
【讨论】:
除了@marios 和@puhlen 已经提到的之外,使用传统列表(头/尾)的另一个原因是用于模式匹配。有两个类对此有帮助。
首先是::(缺点)案例类:
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"
}
【讨论】:
cons 和Nil)