Learning Scala currently and needed to invert a Map to do some inverted value->key lookups. I was looking for a simple way to do this, but came up with only:
(Map() ++ origMap.map(kvp=>(kvp._2->kvp._1)))
Anybody have a more elegant approach?
By default, Scala uses the immutable Map. If you want to use the mutable Map, you'll have to import scala.
Scala map is a collection of key/value pairs. Any value can be retrieved based on its key. Keys are unique in the Map, but values need not be unique.
Maps are classified into two types: mutable and immutable. By default Scala uses immutable Map. In order to use mutable Map, we must import scala.
Assuming values are unique, this works:
(Map() ++ origMap.map(_.swap))
On Scala 2.8, however, it's easier:
origMap.map(_.swap)
Being able to do that is part of the reason why Scala 2.8 has a new collection library.
Mathematically, the mapping might not be invertible (injective), e.g., from Map[A,B]
, you can't get Map[B,A]
, but rather you get Map[B,Set[A]]
, because there might be different keys associated with same values. So, if you are interested in knowing all the keys, here's the code:
val m = Map(1 -> "a", 2 -> "b", 4 -> "b") m.groupBy(_._2).mapValues(_.keys) res0: Map[String,Iterable[Int]] = Map(b -> Set(2, 4), a -> Set(1))
Starting scala 2.13, this becomes even simpler and more efficient:
m.groupMap(_._2)(_._1)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With