据我所知,没有组合器可以直接提供此功能。
For the Seq
部分,嗯,它只适用于List
因为你正在采取List
作为参数。采取一个Seq
,返回一个Seq
这样你就少了一个问题了。
此外,您的实现会抛出一个IndexOutOfBounds
异常如果ind
包含大于或等于的索引seq
length.
这是一个替代实现(它使用Set
对于 O(1)contains
)
def updatedAtIndexes[A](seq: Seq[A], ind: Set[Int], value: A): Seq[A] = seq.zipWithIndex.map {
case (el, i) if ind.contains(i) => value
case (el, _) => el
}
Example
updatedAtIndexes(List(1, 2, 3, 4, 5), Set(0, 2), 42) // List(42, 2, 42, 4)
您甚至可以使用一个简单的隐式类使其更漂亮:
implicit class MyPimpedSeq[A](seq: Seq[A]) {
def updatedAtIndexes(ind: Set[Int], value: A): Seq[A] = seq.zipWithIndex.map {
case (el, i) if ind.contains(i) => value
case (el, _) => el
}
}
Examples
List(1, 2, 3, 4).updatedAtIndexes(Set(0, 2), 42) // List(42, 2, 42, 4)
Vector(1, 2, 3).updatedAtIndexes(Set(1, 2, 3), 42) // Vector(1, 42, 42)