我需要转换以下地图:
Map(1 -> Seq("A", "E"), 2 -> Seq("D", "G"))
为:
Map("a" -> 1, "d" -> 2, "e" -> 1, "g" -> 2)
我该如何解决?
感谢!!!
答案 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)