我有一个不可变的列表,需要一个新的副本,并在多个索引位置替换元素。 List.updated是一个O(n)操作,一次只能替换一个。这样做的有效方法是什么?谢谢!
答案 0 :(得分:7)
List
不适合。来自documentation:
此类适用于后进先出(LIFO),类似堆栈的访问模式。如果您需要其他访问模式,例如随机访问或FIFO,请考虑使用比
List
更适合此类的集合。
更一般地说,您需要的是索引序列而不是线性序列(例如List
)。来自IndexedSeq
的文档:
索引序列支持常量时间或接近恒定时间的元素访问和长度计算。它们是根据适用于索引和长度的抽象方法来定义的。
索引序列不会向
Seq
添加任何新方法,但承诺随机访问模式的高效实现。
IndexedSeq
的默认具体实现是Vector
,因此您可以考虑使用它。
以下是其文档摘录(重点补充):
Vector是一种通用的,不可变的数据结构。 它提供有效恒定时间的随机访问和更新,以及非常快速的追加和前置。因为向量在快速随机选择和快速随机功能更新之间取得了良好的平衡,所以它们目前是不可变索引序列的默认实现
答案 1 :(得分:-2)
list
.iterator
.zipWithIndex
.map { case (index, element) => newElementFor(index) }
.toList