创建一个 Play Enumeratee 将相似元素分组到具有最大大小的列表中

Creating a Play Enumeratee that groups similar elements into lists with a maximum size

我想要一个 Enumeratee,它将 Enumerator 中的元素分组到最大大小的组中,其中组中的所有元素都具有相同的值。因此它将扫描 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 的各种组合,但我还没有找到任何可行的方法。

您的问题可以使用 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)
              }
            }
          }
        }