什么是最简洁的Scala方式来反转地图?

mis*_*tor 7 scala scala-2.8 scala-collections

什么是最简洁的Scala方式来反转地图?地图可能包含非唯一值.

编辑:

逆转 Map[A, B]应该给Map[B, Set[A]](或者一个MultiMap,那会更好).

Rex*_*err 24

如果您丢失了重复的密钥:

scala> val map = Map(1->"one", 2->"two", -2->"two")
map: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two), (-2,two))

scala> map.map(_ swap)
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map((one,1), (two,-2))
Run Code Online (Sandbox Code Playgroud)

如果您不希望以多重映射形式进行访问,只需要设置映射,那么:

scala> map.groupBy(_._2).mapValues(_.keys.toSet)
res1: scala.collection.immutable.Map[
  java.lang.String,scala.collection.immutable.Set[Int]
] = Map((one,Set(1)), (two,Set(2, -2)))
Run Code Online (Sandbox Code Playgroud)

如果你坚持要求MultiMap,那么:

scala> import scala.collection.mutable.{HashMap, Set, MultiMap}
scala> ( (new HashMap[String,Set[Int]] with MultiMap[String,Int]) ++=
     |          map.groupBy(_._2).mapValues(Set[Int]() ++= _.keys) )
res2: scala.collection.mutable.HashMap[String,scala.collection.mutable.Set[Int]]
with scala.collection.mutable.MultiMap[String,Int] = Map((one,Set(1)), (two,Set(-2, 2)))
Run Code Online (Sandbox Code Playgroud)