Использование Group By с Array [(String, Int)] - PullRequest
0 голосов
/ 28 ноября 2018

Работая над 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 голосов
/ 28 ноября 2018

Если я понимаю ваши требования, то то, что вы хотите, можно сделать с помощью следующего фрагмента кода:

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 на самом деле являются содержимым больших файлов, которые не помещаются в память, следует использовать гораздо более сложный алгоритм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...