对列表中的相邻元素进行分组

use*_*855 2 algorithm functional-programming scala

假设我想编写一个执行此操作的函数:

输入:[1,1,3,3,4,2,2,5,6,6]输出:[[1,1],[3,3],[4],[2,2],[5] ],[6,6]]

它将相邻的元素分组相同.

这个方法的名称应该是什么?这个操作有标准名称吗?

Rya*_*pte 6

@tailrec
def groupRuns[A](c: Seq[A], acc: Seq[Seq[A]] = Seq.empty): Seq[Seq[A]] = {
  c match {
    case Seq() => acc
    case xs => 
      val (same, rest) = xs.span { _ == xs.head }
      groupRuns(rest, acc :+ same)
  }
}

scala> groupRuns(Vector(1, 1, 3, 3, 4, 2, 2, 5, 6, 6))
res7: Seq[Seq[Int]] = List(Vector(1, 1), Vector(3, 3), Vector(4), Vector(2, 2), Vector(5), Vector(6, 6))
Run Code Online (Sandbox Code Playgroud)

  • OP 要求命名建议,而不是实现。 (3认同)
  • 但我是从谷歌来到这里的,这个答案对我很有用,所以请保留它:) (2认同)

gzm*_*zm0 5

[1,1,3,3,4,2,2,5,6,6]类似的东西中,[1,1]通常被称为run(如在行程编码中,请参阅Scala中的RLE).因此,我称之为方法groupRuns.