假设我有一个如下数组:
myEngine.entities
我想要许多连续数字的子数组,其中每个连续对的总和小于10
1 2 3 4 5 6 7 8 9 1 2 3 4 5 1 2 3 4
如何以功能惯用的方式在scala中对其进行编码?
1 2 3 4 5, 6, 7, 8, 9, 1 2 3 4 5 1 2 3 4
答案 0 :(得分:1)
执行foldRight
可以更轻松地使用head
和tail
来构建生成的List
。
val grouped = Array(3,8,1,9,1,3).foldRight(List.empty[Array[Int]]){case (n,acc) =>
if (acc.isEmpty) List(Array(n))
else if (acc.head.head + n < 10) n +: acc.head :: acc.tail
else Array(n) :: acc
} // List(Array(3), Array(8, 1), Array(9), Array(1, 3))
答案 1 :(得分:0)
这应该有用(虽然这是一种非常低效的方式):
def group(threshold: Int)(seq: Seq[Int]): Seq[Seq[Int]] =
seq.reverse.tails.find(_.sum < threshold) match {
case None => Nil
case Some(Nil) => Nil
case Some(subSeq) =>
subSeq.reverse +: group(threshold)(seq.drop(subSeq.size))
}
group(10)(Array(3, 8, 1, 9, 1, 3))
List(Array(3), Array(8, 1), Array(9), Array(1, 3))