【问题标题】:How to combine two objects in a List by summing a member如何通过对成员求和来组合列表中的两个对象
【发布时间】:2021-02-09 11:37:27
【问题描述】:

鉴于此case class

case class Categories(fruit: String, amount: Double, mappedTo: String)

我有一个包含以下内容的列表:

List(
  Categories("Others",22.38394964594807,"Others"),
  Categories("Others",77.6160503540519,"Others")
)

如果它们属于同一类别,我想通过总结它们的数量来组合列表中的两个元素,以便在这种情况下的最终结果是:

List(Categories("Others",99.99999999999997,"Others"))

我该怎么做?

【问题讨论】:

  • 到目前为止您尝试过什么?查看使用groupBygroupMapReduce 收集所有“相似”值,然后合并相应的字段。
  • 你想怎么做?基于水果?映射到?两者都有?
  • 我只想按 mappedTo 分组
  • 如果有 2 个不同的具有相同的 mappedTo,结果应该是什么?
  • 目前在给定的数据中,我们不考虑根据fruit进行分组,只需要根据mappedTo进行分组,考虑mappedTo和fruit的数据相同

标签: scala scala-collections


【解决方案1】:

由于 groupMapReduce 是在 Scala 2.13 中引入的,我将尝试为 Martinjn 的出色答案提供另一种方法。

假设我们有:

case class Categories(Fruit: String, amount: Double, mappedTo: String)
val categories = List(
  Categories("Apple",22.38394964594807,"Others"),
  Categories("Apple",77.6160503540519,"Others")
)

如果您想同时按mappedToFruit 进行聚合

val result = categories.groupBy(c => (c.Fruit, c.mappedTo)).map {
  case ((fruit, mappedTo), categories) => Categories(fruit, categories.map(_.amount).sum, mappedTo)
}

代码运行可以在Scastie找到。

如果你只想通过mappedTo聚合,并随机选择一个Fruit,你可以这样做:

val result = categories.groupBy(c => c.mappedTo).map {
  case (mappedTo, categories) => Categories(categories.head.Fruit, categories.map(_.amount).sum, mappedTo)
}

代码运行可以在Scastie找到

【讨论】:

    【解决方案2】:

    您希望按类别对列表条目进行分组,并将它们减少为单个值。 groupMapReduce 用于对条目进行分组,然后映射组(您不需要这个)并将组减少为单个值。

    给定

    case class Category(category: String, amount: Double)

    如果你有val myList: List[Category],那么你想在Category#category分组,并通过合并成员来减少它们,总结数量。

    给了

    myList.groupMapReduce(_.category) //group
                         (identity)   //map. We don't need to map, so we use the identity mapping
                         {
                            case (Category(name, amount1), Category(_, amount2)) =>
                              Category(name, amount1 + amount2) }
                         }            //reduce, combine each elements by taking the name, and summing the amojunts
    

    理论上,只需一个 groupReduce 就足够了,但那不存在,所以我们在这里坚持使用身份。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多