如何 groupBy 迭代器而不将其转换为 Scala 中的列表?

Aru*_*run 5 functional-programming scala

假设我想groupBy在迭代器上,编译器要求“ value groupBy is not a member of Iterator[Int]”。一种方法是将迭代器转换为我想避免的列表。我想做groupBy这样的输入Iterator[A]和输出Map[B, Iterator[A]]。这样只有在访问元素的那部分时才加载迭代器的部分,而不是将整个列表加载到内存中。我也知道可能的键集,所以我可以判断一个特定的键是否存在。

def groupBy(iter: Iterator[A], f: fun(A)->B): Map[B, Iterator[A]] = {
    .........
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*zyk 1

我认为如果不将结果存储在内存中这是不可能的(在这种情况下切换到列表会更容易)。Iterator意味着您只能对整个集合进行一次传递。

例如,假设您有一个序列1 2 3 4 5 6,并且您想对groupBy偶数取奇数:

groupBy(it, v => v % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

true然后您可以使用和查询结果false以获得迭代器。问题应该是你循环这两个迭代器之一直到最后你不能对另一个迭代器做同样的事情(因为你不能在 Scala 中重置迭代器)。

如果元素根据您在 中使用的相同规则进行排序,那么这是可行的groupBy

  • @Arun,您可以做到这一点的唯一方法是使用某种缓冲区,因为如果您首先获取“3”的值,然后想要访问“2”的所有值,则需要将它们作为迭代器保存在内存中无法回去。在最坏的情况下,您必须将整个集合存储在内存中。 (2认同)