通过 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)
我有一个第一个序列,例如:
val s: Seq[Double] = List.fill(6)(0.0)
和 s 的索引的子序列:
val subInd: Seq[Int] = List(2, 4, 5)
现在,我要做的是用另一个长度为 subInd:
的 Seq 更新位置 2、4 和 5 上的 sval 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)