2011-12-30 100 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))) 
相關問題