Как сгруппировать повторяющуюся последовательность переменной длины в Scala

у меня есть набор int, которые повторяются в шаблоне:

val repeatingSequence = List(1,2,3,1,2,3,4,1,2,1,2,3,4,5)

Я бы хотел разделить этот список, когда шаблон повторяется; в этом случае, когда последовательность возвращается к 1:

val groupedBySequence = List(List(1,2,3), List(1,2,3,4), List(1,2), List(1,2,3,4,5))

Обратите внимание, что я группирую, когда последовательность возвращается к 1, но последовательность может быть произвольной длины. Мы с коллегой решили эту проблему, добавив дополнительный метод под названием groupWhen

class IteratorW[A](itr: Iterator[A]) {
  def groupWhen(fn: A => Boolean): Iterator[Seq[A]] = {
    val bitr = itr.buffered
    new Iterator[Seq[A]] {
      override def hasNext = bitr.hasNext
      override def next = {
        val xs = collection.mutable.ListBuffer(bitr.next)
        while (bitr.hasNext && !fn(bitr.head)) xs += bitr.next
        xs.toSeq
      }
    }
  }
}
implicit def ToIteratorW[A](itr: Iterator[A]): IteratorW[A] = new IteratorW(itr)

> repeatingSequence.iterator.groupWhen(_ == 1).toSeq
List(List(1,2,3), List(1,2,3,4), List(1,2), List(1,2,3,4,5))

. Однако мы оба чувствуем, что в библиотеке коллекций скрывается более элегантное решение.

6
задан Matt Hughes 23 July 2011 в 14:06
поделиться