【问题标题】:Creating a Play Enumeratee that groups similar elements into lists with a maximum size创建一个 Play Enumeratee,将相似元素分组到具有最大大小的列表中
【发布时间】:2015-03-04 18:33:34
【问题描述】:

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

【问题讨论】:

    标签: playframework reactivemongo


    【解决方案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)
                  }
                }
              }
            } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 2012-01-06
      • 2013-09-28
      • 2019-02-15
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多