现在在斯卡拉学习Streams。任何人都可以帮助我删除Stream中所有第n个元素的功能。 [2,3,99,1,66,3,4]; 3必须返回:[2,3,1,66,4]
答案 0 :(得分:3)
myStream.zipWithIndex //attach index to every element
.filter(x => (1 + x._2) % n > 0) //adjust index, remove every nth
.map(_._1) //remove index
哎呀,差点忘了:filter
和map
可以合并。
myStream.zipWithIndex
.collect{case (e,x) if (1 + x) % n > 0 => e}
答案 1 :(得分:2)
我想在没有zipWithIndex
的情况下尝试这样做,并且到达:
def dropNth[T](s: Stream[T], n: Int): Stream[T] = {
val (firstn, rest) = s.splitAt(n)
if (firstn.length < n)
firstn
else
firstn.take(n - 1) #::: dropNth(rest, n)
}
必须有一种方法可以用折叠或扫描替换显式递归,但它似乎并不重要。
答案 2 :(得分:0)
(在我的评论中,我错过了省略所有 nth的要求。)以下是基于@jwvh答案的.zipWithIndex
和flatMap
的解决方案:
stream.zipWithIndex.flatMap{ case (v, idx) if (idx + 1) % n > 0 => Stream(v) // keep when not nth
case _ => Stream.empty // omit nth
}
此处flatMap
的使用方式与filter
类似。如果你需要用空的Stream替换第n个元素,这可能很有用。