Scala:翻转键值映射

时间:2018-04-10 15:48:48

标签: scala collections

我需要转换以下地图:

Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))

为:

Map("a" -> 1, "d" -> 2, "e" -> 1, "g" -> 2)

我该如何解决?

感谢!!!

5 个答案:

答案 0 :(得分:4)

使用flatMap并使用地图将内部列表转换为所需的表单。

警告:Seqs不得有重复项。

scala> val map = Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))
map: scala.collection.immutable.Map[Int,Seq[String]] = Map(1 -> List(A, E), 2 -> List(D, G))

scala> map.flatMap { case (k, v) => v.map(_.toLowerCase -> k) }
res0: scala.collection.immutable.Map[String,Int] = Map(a -> 1, e -> 1, d -> 2, g -> 2)

答案 1 :(得分:4)

假设m是您的输入地图,

for ((v, ks) <- m; k <- ks) yield (k.toLowerCase, v)

产生

Map(a -> 1, e -> 1, d -> 2, g -> 2)

这基本上是食谱的1:1翻译:&#34;对于原始地图中的每对整数值v和字母ks列表,请取每个字母{{1来自k并将ks对添加到新地图&#34;。

答案 2 :(得分:2)

你可以做类似下面的事情

val m = Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))

println(m.flatMap(x => x._2.map(y => (y.toLowerCase, x._1))))

你会得到

Map(a -> 1, e -> 1, d -> 2, g -> 2)

答案 3 :(得分:0)

另一个答案是正确的,但对于那些不熟悉scala的人来说,他们很难理解。 以下内容简单易懂

val z = Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))
z.map{case (i,l) => l.map(s=> (s.toLowerCase->i))}.flatten.toMap

答案 4 :(得分:0)

我们也可以使用collect来实现此目标

scala> val map =Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))
map: scala.collection.immutable.Map[Int,Seq[String]] = Map(1 -> List(A, E), 2 -> List(D, G))

 scala> map.collect{case (k,v) => v.map(_.toLowerCase -> k)}.flatten.toMap
//res2: scala.collection.immutable.Map[String,Int] = Map(a -> 1, e -> 1, d -> 2, g -> 2)