У меня есть следующий изменяемый 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)
}
Может быть, вы хотели использовать groupMapReduce
раньше?
@SilvioMayolo Я добавил код, и это был мой вывод println.
Какой цели служат ключи в хэш-карте в вашем примере кода? Похоже, вы группируете по части значения, а не по ключу? Есть ли какое-то значение в части xx
, yy
и т. д., или мы можем просто избавиться от этого?
@LuisMiguelMejíaSuárez Привет. Мне нужно реализовать его в чистой scala 2.
@SilvioMayolo В моем приложении есть концепция. Но на этот раз я просто хочу сгруппировать значения по ключу (например, a
, b
, c
, а не xx
или yy
). Я хочу сбросить ключи первой хэш-карты (т.е. m
).
m.values.groupMapReduce(tuple => tuple._1)(tuple => tuple._2)((a, b) => a + b)
Похоже, что у вас есть не хеш-карта, а m.values
типа Iterable[Tuple2[String, Int]]
, который более управляем. В этом случае, как намекают в комментариях, groupMapReduce
делает все это в одной функции. Эта функция группирует «совпадающие» элементы вместе, применяет преобразование к каждому элементу, а затем уменьшает группы с помощью бинарной операции.
m.values.groupMapReduce(_._1)(_._2)(_ + _)
Это говорит: «Сгруппируйте значения по первому элементу их кортежа, затем сохраните второй элемент (т.е. число), а затем добавьте все числа в каждой группе». Это создает карту от первого элемента кортежа до суммы.
Map(a -> 10, b -> 3, c -> 4)
Обратите внимание, что это Map
, а не обязательно HashMap
. Если вам нужен HashMap
(т. е. для изменчивости), вам нужно будет преобразовать его самостоятельно.
Я использовал Scala 2, и groupMapReduce
не может быть разрешен компилятором.
@MajidHajibaba groupMapReduce
был представлен в Scala 2 =)
Для версий Scala до 2.13 вы можете попробовать использовать groupBy
с map
:
m.values
.groupBy(_._1)
.mapValues(_.map(_._2).sum)
Ключи в хэш-карте уникальны, поэтому у вас нет этой изменяемой хэш-карты. К тому времени, когда вы поместите эти ключи в хэш-карту, вы уже потеряете более старый из них. Откуда вы берете эти данные? Можете ли вы получить его, возможно, как список кортежей или что-то, что допускает дублирование?