如何在Scala中对可变长度的重复序列进行分组
发布时间:2020-12-16 19:08:46 所属栏目:安全 来源:网络整理
导读:我有一组在一个模式中重复的整数: val repeatingSequence = List(1,2,3,1,4,5) 当模式重复时,我想将List列出来;在这种情况下,当序列返回到1时: val groupedBySequence = List(List(1,3),List(1,4),2),5)) 请注意,当序列跳回到1时,我正在分组,但序列可以是
我有一组在一个模式中重复的整数:
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |