【问题标题】:Scala how to group a map and then subgroup and transform valuesScala如何对地图进行分组,然后对值进行分组和转换
【发布时间】:2018-06-21 06:39:17
【问题描述】:

我有一个这样的对象:

case class MyObject(x : Int,y : String,...) {
   val buckets = 3
   def bucket = x % buckets // returns a number between 0 and |buckets|
}

(x 是任意数)

例如假设“buckets = 3”,我们有很多对象

MyObject(x = 0, y = "Something", ...)
MyObject(x = 1, y = "Something else", ...)
....
...

使用“groupBy”我收集“MYObjects”使用x % buckets,所以它会像:

val objects : Seq[MyObject] = ...
val groupedObjects : Map[Int: Seq[MyObjects]] = objects.groupBy(obj => x.bucket)

现在我想转换每个值并重新组合为不同类型的子列表

所以对于 group = 1 中的每个项目,我想嵌套在一个附加层下并存储不同的计算值:

所以假设初始分组后的存储桶 0 看起来像:

bucket[0] = [obj1,obj2,...,objn]

我希望能够将存储桶“0”转换为包含另一个嵌套分组:

bucket[0] = Map(sub_bucket_0 -> [transformed(objects)...], sub_bucket_1 -> [transformed(object)...),....]

意味着最终我有一个类型为:

的数据结构
Map[Int,Map[Sub_bucket_type,Seq[TransformedObject_type]]]

【问题讨论】:

    标签: scala collections functional-programming


    【解决方案1】:

    我认为您正在寻找的是mapValues(),它将把 Map 的值元素修改为新的值和/或类型。

    groupedObjects.mapValues(_.groupBy(/*returns new key type/value*/))
                  .mapValues(_.mapValues(_.map(/*transform MyObject elements*/)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2021-10-10
      • 2018-07-19
      • 2021-07-13
      • 2016-04-04
      • 2022-01-20
      • 2016-12-11
      相关资源
      最近更新 更多