2011-12-30 8 views
5

Tengo una lista de documentos, donde un documento tiene un propietario que es un usuario.Lista de transformación en el mapa del elemento -> lista (elemento) en scala

¿Cuál es la forma más elegante de transformar esta lista en un Mapa de usuarios a la Lista de documentos que poseen?

Así, por ejemplo, que tienen:

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

que debe terminar con un mapa de:

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

No puedo pensar en una manera que sería para agarrar todos los usuarios únicos de los documentos y para cada uno de ellos filtra la lista de documentos para que sean solo los que poseen, pero me pregunto si hay una manera de utilizar una cantidad fija de pases a través de la lista para evitar cualquier problema de rendimiento si la lista es grande.

Respuesta

13

Uso 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))) 
Cuestiones relacionadas