通过 Scala 中的另一个 Seq 更新 Seq 的特定索引

Update specific indices of Seq by another Seq in Scala

我有一个第一个序列,例如:

val s: Seq[Double] = List.fill(6)(0.0)

和 s 的索引的子序列:

val subInd: Seq[Int] = List(2, 4, 5)

现在,我要做的是用另一个长度为 subInd:

的 Seq 更新位置 2、4 和 5 上的 s
val t: Seq[Double] = List(5.0, 6.0, 7.0)

例如:

val updateBySeq(s, subInd, t): List[Double] = List(0.0, 0.0, 5.0, 0.0, 6.0, 7.0)

我在该站点上进行了搜索,发现 Update multiple values in a sequence 第二个答案接近我想要的功能。

但是,不同之处在于,所提供的函数会将 subInd 中包含的索引上的 s 更新 one 值。另一方面,我希望它们对应于第三个 Seq t 中的多个唯一值。

我已经尝试过各种方法,例如使用递归和 ListBuffers 而不是列表来逐步更新 s 的元素,但是它们要么保持 s 不变,要么我遇到错误,因为我违反了一些不变性约束。

这应该有效:

def updateListByIndexes[T](data: List[T])(indexes: List[Int], update: List[T]): List[T] = {
  val updateMap = (indexes lazyZip update).toMap

  data.iterator.zipWithIndex.map {
    case (elem, idx) =>
      updateMap.getOrElse(key = idx, default = elem)
  }.toList
}

你可以这样使用:

val s = List.fill(6)(0.0)
// s: List[Double] = List(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

val subInd = List(2, 4, 5)
// subInd: List[Int] = List(2, 4, 5)

val t = List(5.0, 6.0, 7.0)
// t: List[Double] = List(5.0, 6.0, 7.0)

updateListByIndexes(s)(subInd, t)
// res: List[Double] = List(0.0, 0.0, 5.0, 0.0, 6.0, 7.0)