2011-12-30 112 views
5

我有一个文档列表,其中一个文档拥有一个用户是一个用户。将列表变换为scala中元素 - >列表(元素)的映射

将此列表转换为用户映射到他们拥有的文档列表的最优雅方式是什么?

因此,例如,我有:

"doc1" owned by user "John" 
"doc2" owned by user "Frank" 
"doc3" owned by user "John" 

我应该地图结束:

"John" -> List("doc1", "doc3"), "Frank" -> List("doc2") 

我能想到的一个方式,也将抓住从文档中的所有独特的用户并为他们每个人过滤文件列表只是他们自己的,但我想知道是否有一种方法,使用固定数量的通过列表来防止任何性能问题,如果列表很大。

回答

13

使用GROUPBY:

scala> case class Doc(id: String, owner: String) 
defined class Doc 

scala> List(Doc("doc1", "John"), Doc("doc2", "Frank"), Doc("doc3", "John")) 
res0: List[Doc] = List(Doc(doc1,John), Doc(doc2,Frank), Doc(doc3,John)) 

scala> res0.groupBy(_.owner) 
res1: scala.collection.immutable.Map[String,List[Doc]] = Map(
    Frank -> List(Doc(doc2,Frank)), John -> List(Doc(doc1,John), Doc(doc3,John)))