创建一个 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)
}
}
}
}
我想要一个 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)
}
}
}
}