Оба ответа являются полностью правильными, учитывая ваши исходные данные. Однако мой ответ предполагает, что ваш вклад не ограничен предоставленной формой.
Еще один способ решения этой проблемы - изначально структурировать ваши данные в кортеж, для получения дополнительной информации изучите кортежи здесь .
Для вашего примера это будет выглядеть так:
val = lisinputt = List(
("banana", 10),
("apple", 20),
("apple", 30),
("banana", 10),
("berry", 10))
Затем, используя приведенные ниже, вы можете получить доступ и объединить списки.
val aggreagatedList = lisinputt.groupBy(_._1).map {
case (fruit, number) => ( fruit, number.size , number.map(_._2).sum )
}
По сути, это делает то же самое, что и оба других ответа (посмотрите на случай e =>, и вы увидите сходство), однако в обоих ответах есть логика для изменения вашего ввода, чтобы он мог быть агрегирован.
В этой команде происходит несколько вещей, которые стоит объяснить:
- Во-первых, groupBy, примененный к lisinputt, будет сортировать по уникальным параметрам
- _._ 1 означает первую запись всех кортежей (параметр для groupBy)
- case (fruit, member) присваивает переменные 1-му и 2-му элементам в вашем кортеже (вы можете указать это как одну переменную, но это сделает методы доступа менее читаемыми
- означает, что => для каждого уникального случая (описанного выше для groupBy) возвращает запись кортежа, первым элементом которого является имя, вторым - вхождения, а третьим - суммирование всех вторых записей совпадающих фруктов в оригинале. кортеж.
Надеюсь, это поможет, я тоже учусь, поэтому, если в решении есть ошибки или мое понимание этих функций, я только рад принять исправления.