反转 Map 的最简洁的 Scala 方法是什么? [英] What is the most succinct Scala way to reverse a Map?

查看:53
本文介绍了反转 Map 的最简洁的 Scala 方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

What is the most succinct Scala way to reverse a Map? The Map may contain non-unique values.

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

The reversal of Map[A, B] should give Map[B, Set[A]] (or a MultiMap, that would be even better).

推荐答案

如果您可能会丢失重复键:

If you can lose duplicate keys:

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

如果您不想以多图的形式访问,只需要一个到集合的映射,那么:

If you don't want access as a multimap, just a map to sets, then:

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

如果你坚持要获得一个MultiMap,那么:

If you insist on getting a MultiMap, then:

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

这篇关于反转 Map 的最简洁的 Scala 方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆