Как построить мультикарту из списка кортежей в Scala? - PullRequest
23 голосов
/ 26 августа 2011

Предположим, у меня есть список кортежей List[(A, B)]. Каков наилучший способ преобразовать его в multimap, который отображает A в Set[B]? Могу ли я построить неизменный multimap?

Ответы [ 2 ]

20 голосов
/ 27 августа 2011

Могу ли я создать неизменную мультикарту?

Не с MultiMap в стандартной библиотеке Scala.Конечно, вы можете написать свой собственный.

Как лучше всего преобразовать его в мультикарту?

import scala.collection.mutable.{HashMap, Set, MultiMap}

def list2multimap[A, B](list: List[(A, B)]) = 
  list.foldLeft(new HashMap[A, Set[B]] with MultiMap[A, B]){(acc, pair) => acc.addBinding(pair._1, pair._2)}
15 голосов
/ 27 августа 2011

Я немного запутался, Multimap не сопоставляет A с Set[B], оно сопоставляет A с B, где B может иметь много значений. Так как вы хотите что-то неизменное, я собираюсь изменить это на Map[A, Set[B]], который не Multimap, но выполняет одну из тех вещей, которые вы сказали, что хотели.

// This is your list of (A, B)
val l = List((1, "hi"),
             (2, "there"),
             (1, "what's"),
             (3, "up?"))
// Group it and snip out the duplicate 'A'
// i.e. it initially is Map[A, List[(A, B)]] and we're going to convert it
// to Map[A, Set[B]]
val m = l.groupBy(e => e._1).mapValues(e => e.map(x => x._2).toSet)
println(m)
// Prints: Map(3 -> Set(up?), 1 -> Set(hi, what's), 2 -> Set(there))
...