嗯,我有一个解决方案,但我怀疑可以做得更好:
(test.head :: test).sliding(2).toList.map( (pair: List[Int]) => (pair(1), pair(1) - pair(0)) )
.foldLeft(List(List.empty[Int])){ (acc, pair) =>
if (pair._2 < 3) (pair._1 :: acc.head) :: acc.tail else List(pair._1) :: acc }
请注意,这给出了“双反转”顺序的结果:
res3: List[List[Int]] = List(List(14, 12, 10), List(6), List(3, 1))
可以通过添加来纠正.map(_.reverse).reverse
到函数结束。
EDIT- 替代尝试:
def func(is: List[Int], diff: Int): List[List[Int]] = {
def loop(is: List[Int], prev: Int, acc: List[List[Int]]): List[List[Int]] = is match {
case Nil => acc
case h :: t if (h - prev < diff) => loop(t, h, (h :: acc.head) :: acc.tail)
case h :: t => loop(t, h, List(h) :: acc)
}
loop(is, is.head, List(List.empty[Int]))
}
再次给出双逆形式的解。