Scala: объединить несколько элементов в списке, когда они имеют одинаковое свойство - PullRequest
0 голосов
/ 23 октября 2019

Как объединить некоторые элементы в списке, если они имеют одинаковое свойство?

Например, скажем, у меня есть следующее:

case class Foo(year: Int, amount: Int)
val list = List(Foo(2015, 10), Foo(2015, 15), Foo(2019, 55))

Как преобразовать list вList(Foo(2015, 25), Foo(2019, 55)) путь Скала?

Как видите, Foo(2015, 10) и Foo(2015, 15) объединены в List(Foo(2015, 25).

Аналогичный вопрос с Объединение элементов в одном списке , но это для C #/LINQ.

Ответы [ 3 ]

4 голосов
/ 23 октября 2019

Если вы используете Scala 2.13 +, рассмотрите возможность использования groupMapReduce:

list.groupMapReduce(_.year)(_.amount)(_ + _).
  map{ case (y, a) => Foo(y, a) }
// res1: scala.collection.immutable.Iterable[Foo] = List(Foo(2019,55), Foo(2015,25))
2 голосов
/ 23 октября 2019

Используйте groupBy, чтобы упорядочить list на year, затем сопоставьте результаты, чтобы получить их правильную форму, и sum amount каждого Foo.

scala> list.groupBy(foo => foo.year).map(m => Foo(m._1, m._2.map(foo => foo.amount).sum))
res5: scala.collection.immutable.Iterable[Foo] = List(Foo(2015,25), Foo(2019,55))
0 голосов
/ 24 октября 2019

Просто Рефакторинг из Brian . Я использую Pattern Matching для правильного именования значений.

Я думаю, что это помогает прочитать код.

list
  .groupBy{case Foo(year, _) => year}
  .map{ case (year, foos) => 
     Foo(year, 
         foos.map{ case Foo(_, amount) => amount}.sum)
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...