斯卡拉。如何从Stream中删除所有第n个元素

时间:2017-11-29 18:36:20

标签: scala stream

现在在斯卡拉学习Streams。任何人都可以帮助我删除Stream中所有第n个元素的功能。 [2,3,99,1,66,3,4]; 3必须返回:[2,3,1,66,4]

3 个答案:

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

哎呀,差点忘了:filtermap可以合并。

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答案的.zipWithIndexflatMap的解决方案:

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个元素,这可能很有用。