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

标签 scala functional-programming

假设我想 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]] = {
    .........
}

最佳答案

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

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

groupBy(it, v => v % 2 == 0)

然后你可以用 true 查询结果和 false得到一个迭代器。如果您将这两个迭代器中的一个循环到最后,您将无法为另一个迭代器做同样的事情(因为您无法在 Scala 中重置迭代器),那么问题就来了。

如果元素按照您在 groupBy 中使用的相同规则进行排序,这将是可行的。 .

关于scala - 如何 groupBy 迭代器而不将其转换为 Scala 中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427059/

相关文章:

java - 如何将 instanceof 与 scala 对象一起使用?

Scala 类型语法

scala - 在 Scala 中,如何获取 XML 节点的文本而不获取其子节点的文本?

java - Scala 隐式类参数

scala - 从上到下打印供应商段

functional-programming - 关于闭包中词法绑定(bind)的更多解释?

function - 寻找功能组成的解释

oop - 为什么 Smalltalk 支持一流的功能,而不支持其他功能特性?

java - 什么时候考虑 Java 中的代码效率?

scala - DI 或服务定位器 : Injecting implementations at run-time ( no static binding ) in scala