У меня есть набор целых чисел, которые повторяются в шаблоне:
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))
Однако мы оба чувствуем, что в библиотеке коллекций скрывается более элегантное решение.