Scala добавить _2 в список Tuple 2

У меня есть следующий изменяемый 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)
  }

1
41
2

Ответы:

Похоже, что у вас есть не хеш-карта, а m.values типа Iterable[Tuple2[String, Int]], который более управляем. В этом случае, как намекают в комментариях, groupMapReduce делает все это в одной функции. Эта функция группирует «совпадающие» элементы вместе, применяет преобразование к каждому элементу, а затем уменьшает группы с помощью бинарной операции.

m.values.groupMapReduce(_._1)(_._2)(_ + _)

Это говорит: «Сгруппируйте значения по первому элементу их кортежа, затем сохраните второй элемент (т.е. число), а затем добавьте все числа в каждой группе». Это создает карту от первого элемента кортежа до суммы.

Map(a -> 10, b -> 3, c -> 4)

Обратите внимание, что это Map, а не обязательно HashMap. Если вам нужен HashMap (т. е. для изменчивости), вам нужно будет преобразовать его самостоятельно.


Решено

Для версий Scala до 2.13 вы можете попробовать использовать groupBy с map:

m.values
  .groupBy(_._1)
  .mapValues(_.map(_._2).sum)

Интересные вопросы для изучения