根据索引有效过滤列表中的元素

时间:2019-01-04 11:09:10

标签: scala

我正在做一个练习,要求删除奇数位置的元素。

我想知道我认为是否有最好的选择:

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那样产生中间列表?

3 个答案:

答案 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)