Quelle est la manière la plus succincte Scala pour inverser une carte? La carte peut contenir des valeurs non uniques. strong> p>
Le renversement de la carte [A, B] code> devrait donner mapper [B, régler [A]]] code> (ou un multimap, qui serait encore meilleur). < / p>
3 Réponses :
Si vous pouvez perdre des touches en double: Si vous ne voulez pas avoir accès en tant que multimap, une carte à définir, alors: p> Si vous insistez pour obtenir un multimap code>, alors: p>
Un meilleur démarrage serait plus clair cependant, par ex. Carte (1 -> "One", 2 -> "Deux", 3 -> "Deux", 4 -> "Deux")
object RevMap {
def
main(args: Array[String]): Unit = {
val m1 = Map("one" -> 3, "two" -> 3, "three" -> 5, "four" -> 4, "five" -> 5, "six" -> 3)
val rm1 = (Map[Int, Set[String]]() /: m1) { (map: Map[Int, Set[String]], pair: (String, Int)) =>
map + ((pair._2, map.getOrElse(pair._2, Set[String]()) + pair._1)) }
printf("m1=%s%nrm1=%s%n", m1, rm1)
}
}
% scala RevMap
m1=Map(four -> 4, three -> 5, two -> 3, six -> 3, five -> 4, one -> 3)
rm1=Map(4 -> Set(four, five), 5 -> Set(three), 3 -> Set(two, six, one))
Que diriez-vous:
implicit class RichMap[A, B](map: Map[A, Seq[B]])
{
import scala.collection.mutable._
def reverse: MultiMap[B, A] =
{
val result = new HashMap[B, Set[A]] with MultiMap[B, A]
map.foreach{case(k,v) => v.foreach(result.addBinding(_, k))}
result
}
}
Définissez ce qui se passe si une valeur donnée est présente sous plusieurs touches.