与数组一起使用分组依据[(String,Int)]

时间:2018-11-27 22:17:25

标签: scala group-by

在Scala上工作,我有以下内容:

val file1 = Array(("test",2),("other",5));
val file2 = Array(("test",3),("boom",4));

然后我加入两个数组:

val toGether = file1.union(file2);

最后想要产生一个GroupBy,它将产生以下内容:

Array(("test",(2,3)),("other",(5,0)),("boom",(0,4)))

这可能吗?

1 个答案:

答案 0 :(得分:0)

如果我了解您的要求,那么可以使用以下代码完成您想要的事情:

val file1 = Array(("test", 2), ("other", 5))
val file2 = Array(("test", 3), ("boom", 4))

val map1 = file1.toMap
val map2 = file2.toMap
val allKeys = map1.keySet ++ map2.keySet
val result: Array[(String, (Int, Int))] = allKeys.map(k => (k, (map1.getOrElse(k, 0), map2.getOrElse(k, 0))))(scala.collection.breakOut)

println(result.mkString)

这个想法很简单:将两个数组都转换为映射,并使用连接键集上的迭代来创建结果数组。请注意,这段代码不会保留任何顺序,但是我不确定这是否重要,它会使代码更简单。还请注意,此代码实际上需要将集合容纳到内存中几次。如果file1file2实际上是不适合内存的大文件的内容,则应使用更复杂的算法。