tl/dr:Kotlin 如何使用 groupingBy 和聚合来获得(键,数字)对的序列以求和到计数映射?
我有 30gb 的 csv 文件,可以轻松阅读和解析。
File("data").walk().filter { it.isFile }.flatMap { file ->
println(file.toString())
file.inputStream().bufferedReader().lineSequence()
}. // now I have lines
Run Code Online (Sandbox Code Playgroud)
每行都是“key,extraStuff,matchCount”
.map { line ->
val (key, stuff, matchCount) = line.split(",")
Triple(key, stuff, matchCount.toInt())
}.
Run Code Online (Sandbox Code Playgroud)
我可以过滤“东西”,这很好,因为很多东西都被丢弃了——是的,懒惰的序列。(省略代码)
但是我需要一种懒惰的方法来获得最终的 Map(key:String to count:Int)。
我想我应该使用 groupingBy 和聚合,因为eachCount()只会计算行数,而不是总结 matchCount,并且 groupingBy 是懒惰的,而 groupBy 不是,但我们已经达到了我的知识范围。
.groupingBy { (key, _, _) ->
key
}.aggregate { (key, _, matchCount) ->
??? something with matchCount ???
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Grouping.fold扩展名而不是Grouping.aggregate. 它更适合按特定属性汇总分组条目:
triples
.groupingBy { (key, _, _) -> key }
.fold(0) { acc, (_, _, matchCount) -> acc + matchCount }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5814 次 |
| 最近记录: |