我喜歡這樣的事情;
def dropEvery[A](arr: Seq[A], n: Int) = arr.foldLeft((Seq.empty[A], 0)) {
case ((acc, idx), _) if idx == n - 1 => (acc, 0)
case ((acc, idx), el) => (acc :+ el, idx + 1)
}._1
// example: dropEvery(1 to 100, 3)
// res0: Seq[Int] = List(1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 100)
這是有效的,因爲它需要在陣列上單次通過,並從它移除每第n個元素 - 我相信這是容易看到的。 第一個案例與idx == n - 1
匹配,並忽略該索引處的元素,並通過acc
並將計數重置爲0
以用於下一個元素。 如果第一種情況不匹配,這增加了該元素添加到acc
結束並遞增1
既然你願意擺脫了Java 解酒的,你可能想計數使用隱班一個非常好的方式來使用:
implicit class MoreFuncs[A](arr: Seq[A]) {
def dropEvery(n: Int) = arr.foldLeft((Seq.empty[A], 0)) {
case ((acc, idx), _) if idx == n - 1 => (acc, 0)
case ((acc, idx), el) => (acc :+ el, idx + 1)
}._1
}
// example: (1 to 100 dropEvery 1) == Nil (: true)
你也可能想看看這個http://stackoverflow.com/questions/39105121/how-to-remove-every-nth-element-from-the-scala-list – Shankar