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)
不太清楚,但仍然:
xs.indices.collect { case i if i % 3 == 0 => xs(i) }
Run Code Online (Sandbox Code Playgroud)
一个不错的功能解决方案,无需创建临时向量,列表等:
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)