Scala 从列表[Object]创建映射[String,Map[String,Object]]

Scala 从列表[Object]创建映射[String,Map[String,Object]],scala,dictionary,collections,Scala,Dictionary,Collections,我刚习惯Scala,我有 case class Person(name: String, birthPlace: String, hairColor: String) 我知道应该有一个很好的方法将列表[人员]转换为 Map[Name, Map[Birthplace, Person]] 但是,我不太明白怎么做 非常感谢您的帮助。可能会有不止一个人具有相同的姓名和出生地,因此这类事情的更好数据类型是Map[String,Map[String,Seq[person]]。 您可以使用.groupBy

我刚习惯Scala,我有

case class Person(name: String, birthPlace: String, hairColor: String)
我知道应该有一个很好的方法将列表[人员]转换为

Map[Name, Map[Birthplace, Person]]
但是,我不太明白怎么做


非常感谢您的帮助。

可能会有不止一个人具有相同的姓名和出生地,因此这类事情的更好数据类型是
Map[String,Map[String,Seq[person]]
。 您可以使用
.groupBy
创建它:

    list
      .groupBy(_.name)
      .mapValues(_.groupBy(_.birthplace))
如果要忽略多个引用,可以通过在末尾添加以下内容来放弃它们:

      .mapValues(_.mapValues(_.head))

可能会有不止一个人有相同的名字和出生地,因此这类事情的更好的数据类型应该是
Map[String,Map[String,Seq[person]]
。 您可以使用
.groupBy
创建它:

    list
      .groupBy(_.name)
      .mapValues(_.groupBy(_.birthplace))
如果要忽略多个引用,可以通过在末尾添加以下内容来放弃它们:

      .mapValues(_.mapValues(_.head))

只是一个一般性的问题:为什么不存储两个单独的地图(假设多个人可以拥有相同的出生地)?Map[Name,List[Person]]和Map[birthplace,List[Person]],然后是resultPersonListA.intersect(resultPersonListB)?imo的优点是您可以直接访问两个地图?只是一个一般性的问题:为什么不存储两个单独的地图(假设多人可以拥有相同的出生地)?映射[姓名,列表[人]]和映射[出生地,列表[人]],然后是resultPersonListA.intersect(resultPersonListB)?imo的优势是您可以直接访问这两个映射?