在Scala中更改Seq中的多个元素的最简单方法

时间:2018-03-07 23:52:33

标签: scala

我有一个这样的模板序列:

val template = Seq(0,0,0,0,0,0,0,0,0,0)

我有另一个包含索引的序列应该被修改,如下所示:

val indices = Seq(1,3,7)

我想修改模板序列,方法是,如果元素的索引在索引序列中,则将元素替换为1.

所以输出应该如下:

(0,1,0,1,0,0,0,1,0,0)

实现此功能的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

自己想象:

startkey=[2013]&endkey=[2013]

答案 1 :(得分:2)

解决方案中的foldLeft会重复重建序列。如果序列例如是List且所有indices指向列表的末尾,则效率可能会低效。

您也可以在不重复重建集合的情况下实现它:

val indexSet = indices.toSet
val result = template.zipWithIndex.map{ case (v, i) =>
  if (indexSet contains i) 1 else v
}

对于List,此解决方案将摊销O(n),因为检查整数是否在索引集中是摊销O(1)

也许还有一些用例,其中您的解决方案更受欢迎,但对于一般Seq来说,它并不那么明确。