如何在scala数组中对连续的整数进行分组?

时间:2017-03-15 17:14:14

标签: arrays scala functional-programming

假设我有一个如下数组:

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

2 个答案:

答案 0 :(得分:1)

执行foldRight可以更轻松地使用headtail来构建生成的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))