如何在Scala中对可变长度的重复序列进行分组

我有一组在一个模式中重复的整数:

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

当模式重复时,我想将List列出来;在这种情况下,当序列返回到1时:

val groupedBySequence = List(List(1,3),List(1,4),2),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,5))

但是,我们都觉得这里有一个更优雅的解决方案潜伏在收藏库中.

解决方法

给定迭代器itr,这将起到诀窍:

val head = iter.next()
val out = (
  Iterator continually {iter takeWhile (_ != head)}
  takeWhile {!_.isEmpty}
  map {head :: _.toList}
).toList

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...