如何将Iterator [int]转换为scala中每个bin的频率的映射

时间:2013-12-07 15:55:34

标签: scala scala-collections

我刚学会了如何将整数列表转换为scala中每个bin频率的映射。

How to convert list of integers to a map with frequency per bin in scala

但是我正在使用22 GB的文件,因此我正在通过该文件进行流式传输。

Source.fromFile("test.txt").getLines.filter(x => x.charAt(0) != '#').map(x => x.split("\t")(1)).map(x => x.toInt)

groupby函数仅适用于列表,而不适用于迭代器。我猜是因为它需要内存中的所有值。由于文件大小,我无法将迭代器转换为列表。

所以一个例子是

List(1,2,3,101,330,302).iterator

我怎么能从那里去

res1: scala.collection.immutable.Map[Int,Int] = Map(100 -> 1, 300 -> 2, 0 -> 3)

1 个答案:

答案 0 :(得分:3)

您可以使用折叠:

val iter = List(1,2,3,101,330,302).iterator

iter.foldLeft(Map[Int, Int]()) {(accum, a) => 
                                  val key = a/100 * 100;
                                  accum + (key  -> (accum.getOrElse(key, 0) + 1))}

// scala.collection.immutable.Map[Int,Int] = Map(0 -> 3, 100 -> 1, 300 - 2)