Преобразовать список в карту элементов -> список (элемент) в scala

У меня есть список документов, где у документа есть владелец, который является пользователем.

Каков наиболее элегантный способ преобразования этого списка в карту пользователей к списку документов, которыми они владеют?

Так, например, у меня есть:

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

У меня должна получиться карта:

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

Я могу придумать один способ, который состоял бы в том, чтобы захватить всех уникальных пользователей из документов и для каждого из них отфильтровать список документов, чтобы они были только теми, кто им принадлежит, но мне интересно, есть ли способ, который использует фиксированное количество проходов через список, чтобы предотвратить любые проблемы с производительностью, если список большой.


person user1043466    schedule 30.12.2011    source источник


Ответы (1)


Используйте группуBy:

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)))
person huynhjl    schedule 30.12.2011