У меня есть следующий изменяемый Hashmap в Scala:
HashMap((b,3), (c,4), (a,8), (a,2))
и необходимо преобразовать в следующее:
HashMap((b,3), (c,4), (a,10))
Мне нужно что-то вроде логики функции reduceByKey.
Я добавил код здесь
def main(args: Array[String]) = {
val m = new mutable.HashMap[String,Tuple2[String,Int]]()
println("Hello, world")
m.+=(("xx",("a",2)))
m.+=(("uu",("b",3)))
m.+=(("zz",("a",8)))
m.+=(("yy",("c",4)))
println(m.values)
}
Похоже, что у вас есть не хеш-карта, а m.values
типа Iterable[Tuple2[String, Int]]
, который более управляем. В этом случае, как намекают в комментариях, groupMapReduce
делает все это в одной функции. Эта функция группирует «совпадающие» элементы вместе, применяет преобразование к каждому элементу, а затем уменьшает группы с помощью бинарной операции.
m.values.groupMapReduce(_._1)(_._2)(_ + _)
Это говорит: «Сгруппируйте значения по первому элементу их кортежа, затем сохраните второй элемент (т.е. число), а затем добавьте все числа в каждой группе». Это создает карту от первого элемента кортежа до суммы.
Map(a -> 10, b -> 3, c -> 4)
Обратите внимание, что это Map
, а не обязательно HashMap
. Если вам нужен HashMap
(т. е. для изменчивости), вам нужно будет преобразовать его самостоятельно.