【问题标题】:Update specific indices of Seq by another Seq in Scala用 Scala 中的另一个 Seq 更新 Seq 的特定索引
【发布时间】:2020-05-30 09:13:28
【问题描述】:

我有第一个seq,例如:

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

和s的索引的子序列:

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

现在,我要做的是用另一个 Seq 在位置 2、4 和 5 上更新 s,它的长度为 subInd:

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,第二个答案接近我想要的功能。

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

我尝试了各种方法,例如使用递归和 ListBuffers 而不是 Lists 来增量更新 s 的元素,但是它们要么保持 s 不变,要么因为我违反了一些不变性约束而出现错误。

【问题讨论】:

    标签: scala scala-collections seq


    【解决方案1】:

    这应该可行:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      相关资源
      最近更新 更多