只要满足条件就跳过循环中的N个元素
是否有一种直接的惯用方法,甚至可能是现有的方法来在 Scala 中完成此操作:
执行循环/迭代器根据条件检查序列中的每个元素。每当满足条件时,跳过接下来的 N 个元素,然后继续检查其余的元素,直到再次满足条件,跳过 N 个元素,依此类推。
我想到的唯一方法是使用可变计数器或尾递归。有更好的解决方案吗?
回答
我很惊讶没有人提到unfold()(Scala 2.13.x)。
def select[A](input: List[A], test: A=>Boolean, skipN: Int): List[A] =
List.unfold(input){ lst =>
Option.when(lst.nonEmpty){
if (test(lst.head)) (lst.head, lst.tail.drop(skipN))
else (lst.head, lst.tail)
}
}
在这个版本中,每个被测试“条件”的元素都是结果的一个元素,跳过的元素(当然)不是。