Scala如何对地图进行分组,然后对子组进行分组并转换值

时间:2018-01-11 20:38:26

标签: scala collections functional-programming

我有一个这样的对象:

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]]]

1 个答案:

答案 0 :(得分:1)

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

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