【发布时间】:2011-07-23 13:40:05
【问题描述】:
我有一组以某种模式重复的整数:
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))
但是,我们都觉得收藏库中隐藏着一个更优雅的解决方案。
【问题讨论】:
-
您使用的是哪个版本的 Scala?
-
List(2).iterator.groupWhen(_ == 1) 的结果应该是什么?
-
Thomas Jung - 我认为应该返回一个空列表。该示例中没有以 1 开头的组,因此应该将其丢弃。