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)
  }

Ключи в хэш-карте уникальны, поэтому у вас нет этой изменяемой хэш-карты. К тому времени, когда вы поместите эти ключи в хэш-карту, вы уже потеряете более старый из них. Откуда вы берете эти данные? Можете ли вы получить его, возможно, как список кортежей или что-то, что допускает дублирование?

Silvio Mayolo 06.05.2022 17:51

Может быть, вы хотели использовать groupMapReduce раньше?

Luis Miguel Mejía Suárez 06.05.2022 17:53

@SilvioMayolo Я добавил код, и это был мой вывод println.

Majid Hajibaba 06.05.2022 17:54

Какой цели служат ключи в хэш-карте в вашем примере кода? Похоже, вы группируете по части значения, а не по ключу? Есть ли какое-то значение в части xx, yy и т. д., или мы можем просто избавиться от этого?

Silvio Mayolo 06.05.2022 17:55

@LuisMiguelMejíaSuárez Привет. Мне нужно реализовать его в чистой scala 2.

Majid Hajibaba 06.05.2022 17:56

@SilvioMayolo В моем приложении есть концепция. Но на этот раз я просто хочу сгруппировать значения по ключу (например, a, b, c, а не xx или yy). Я хочу сбросить ключи первой хэш-карты (т.е. m).

Majid Hajibaba 06.05.2022 18:07
m.values.groupMapReduce(tuple => tuple._1)(tuple => tuple._2)((a, b) => a + b)
Luis Miguel Mejía Suárez 06.05.2022 18:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, и groupMapReduce не может быть разрешен компилятором.

Majid Hajibaba 06.05.2022 18:24

@MajidHajibaba groupMapReduce был представлен в Scala 2 =)

Guru Stron 06.05.2022 18:57
Ответ принят как подходящий

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

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

Другие вопросы по теме