7
votes

Quelle est la manière la plus succincte Scala d'inverser une carte?

Quelle est la manière la plus succincte Scala pour inverser une carte? La carte peut contenir des valeurs non uniques.

EDIT:

Le renversement de la carte [A, B] devrait donner mapper [B, régler [A]]] (ou un multimap, qui serait encore meilleur). < / p>


1 commentaires

Définissez ce qui se passe si une valeur donnée est présente sous plusieurs touches.


3 Réponses :


24
votes

Si vous pouvez perdre des touches en double: xxx

Si vous ne voulez pas avoir accès en tant que multimap, une carte à définir, alors: xxx

Si vous insistez pour obtenir un multimap , alors: xxx


1 commentaires

Un meilleur démarrage serait plus clair cependant, par ex. Carte (1 -> "One", 2 -> "Deux", 3 -> "Deux", 4 -> "Deux")



4
votes
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))

0 commentaires

0
votes

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
    }
  }


0 commentaires