创建Play Enumeratee,将类似元素分组为具有最大大小的列表

时间:2015-03-04 18:33:35

标签: playframework reactivemongo

我想要一个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的各种组合,但我还没有设法找到任何有用的东西。

1 个答案:

答案 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)
              }
            }
          }
        }