我想要一个Enumeratee,它将Enumerator中的元素分组为最大大小的组,其中组中的所有元素具有相同的值。因此,只要它们的值相同,它就会扫描枚举器并拉出值。当它达到一个新值时,它会将所有先前的结果滚动到一个列表中(加上大小)。然后它将以新值开始一个新列表。
为简单起见,如果我们有一个类似的列表:
[3,3,3,3,3,3,4,4,4,6,6,6,6,6,2,2,2,2,2,2,4,4]
最大尺寸是5,然后它会像这样分区:
[[3,3,3,3,3],[3],[4,4,4],[6,6,6,6,6],[2,2,2,2,2],[2],[4,4]]
我一直在试验Enumeratee.grouped,Enumeratee.takeWhile和Enumeratee.take的各种组合,但我还没有设法找到任何有用的东西。
答案 0 :(得分:1)
使用Iteratee.fold
val groupingIteratee: Iteratee[Int,List[List[Int]]] =
Iteratee.fold(List.empty[List[Int]])(folder(maxElementsInGroup))
其中folder
是定义为(示例)的函数:
def folder(max: Int) = (list: List[List[Int]], el: Int) => {
list match {
case Nil => List(List(el))
case xs :: rest => {
xs match {
case head :: tail if head == el && xs.size < max => (el +: xs) +: rest
case head :: tail => List(head) +: (xs +: rest)
}
}
}
}