我正在做一个练习,要求删除奇数位置的元素。
我想知道我认为是否有最好的选择:
val a = List(1,2,3,4,5,6)
第一种方法:
a.zipWithIndex.filter(x => (x._2 & 1) == 1).map(_._1)
第二个:
a.indices.filter(i => (i & 1) == 1).map(a(_))
我是否认为第二种方法更有效?因为没有必要像zipWithIndex
那样产生中间列表?
答案 0 :(得分:2)
您可以在压缩列表中使用collect
方法,可能会更清楚
a.zipWithIndex.collect{
case (x,i) if i % 2 == 1 => x
}
https://scalafiddle.io/sf/YbureiX/0
我不确定效率如何
答案 1 :(得分:2)
您可以使用视图来避免出现中间列表:
a.view
.zipWithIndex
.filter(x => (x._2 & 1) == 1)
.map(_._1)
.force
仅在调用a
时遍历force
一次。
答案 2 :(得分:0)
您可以避免使用withFilter
形成中间集合,也可以将列表转换为Vector,以在恒定时间内提取特定索引处的元素:
val a: Vector[Int] = List(1,2,3,4,5,6).toVector
val res: Seq[Int] = a.indices.withFilter(i => (i & 1) == 1).map(a(_))
println(res)