2011-12-30 20 views
5

Mam listę dokumentów, w których dokument ma właściciela będącego użytkownikiem.Lista transformacji do mapy elementu -> lista (element) w scala

Jaki jest najbardziej elegancki sposób przekształcenia tej listy w mapę użytkowników na listę dokumentów, które są ich właścicielami?

Tak na przykład mam:

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

powinienem skończyć z mapą:

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

mogę wymyślić jakiś sposób, który byłby złapać wszystkie unikalnych użytkowników z dokumentami i dla każdego z nich filtruje listę dokumentów po prostu tych, które posiadają, ale zastanawiam się, czy istnieje sposób, który używa stałej liczby przejść przez listę, aby zapobiec problemom wydajności, jeśli lista jest duża.

Odpowiedz

13

Zastosowanie 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)))