我在处理这个Scala集合时做错了什么?

时间:2015-02-10 20:01:59

标签: scala collections

给定List [CaseClass]我想用两个类属性对元素进行分组并得到嵌套的地图

case class CaseClass(
   a   String,
   b   String,
   c   String
)

val collection: List[CaseClass] = List(
   CaseClass("a1","b1","c1"),
   CaseClass("a1","b1","c2"),
   CaseClass("a1","b2","c3"),
   CaseClass("a2","b2","c4"),
   CaseClass("a2","b2","c5"),
)
val res = collection.groupBy(_.a).map{ case (k,v) => v.groupBy(_.b)}

我得到的是Map [String,CaseClass]对象,按" b"属性。但我想得到Map [String,Map [String,CaseClass]]按" a" (外部地图)和" b" (内部地图)像这样:

Map("a1" -> 
         Map("b1" -> List( CaseClass("a1","b1","c1"),
                           CaseClass("a1","b1","c2"))), 
         Map("b2" -> List( CaseClass("a1","b2","c3"))), 
    "a2" -> 
         Map("b2" -> List( CaseClass("a2","b2","c4"),
                           CaseClass("a2","b2","c5"))))

我应该如何更改我的代码?

1 个答案:

答案 0 :(得分:3)

问题是(k,v) => v.groupBy(_.b)需要将(key, value)映射到(key, value),但这是将(key, value)映射到value。钥匙被丢弃了。

所以你只需要保留密钥:

val res = collection.groupBy(_.a).map{ case (k,v) => (k, v.groupBy(_.b)) }