Scala按索引筛选列表

use*_*970 6 functional-programming scala scala-collections

我想在功能上写它,我能做的最好的是:

list.zipWithIndex.filter((tt:Tuple2[Thing,Int])=>(tt._2%3==0)).unzip._1
Run Code Online (Sandbox Code Playgroud)

得到元素0,3,6 ......

是否有更易读的Scala成语?

gzm*_*zm0 13

如果效率不是问题,您可以执行以下操作:

list.grouped(3).map(_.head)
Run Code Online (Sandbox Code Playgroud)

请注意,这构造了中间列表.

或者,您可以使用for-understanding:

for {
  (x,i) <- list zipWithIndex
  if i % 3 == 0
} yield x
Run Code Online (Sandbox Code Playgroud)

这当然与原始解决方案几乎完全相同,只是用不同的方式编写.

我的最后一个替代方案是在压缩列表上使用collect:

list.zipWithIndex.collect {
  case (x,i) if i % 3 == 0 => x
}
Run Code Online (Sandbox Code Playgroud)


om-*_*nom 6

不太清楚,但仍然:

xs.indices.collect { case i if i % 3 == 0 => xs(i) }
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望添加索引访问应该是`O(1)`,否则这将不执行`O(n)`. (4认同)

Kar*_*l S 5

一个不错的功能解决方案,无需创建临时向量,列表等:

def everyNth[T](xs: List[T], n:Int): List[T] = xs match {
  case hd::tl => hd::everyNth(tl.drop(n-1), n)
  case Nil => Nil
}
Run Code Online (Sandbox Code Playgroud)