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