将带有列表值的Map转换为元组列表

时间:2014-06-21 10:53:41

标签: scala

我有一个Map[String,List[String]],我希望将其转换为List[(String, String)],其中给定Tuple的第一个元素是地图键,第二个元素是来自地图的相应列表。

例如:

Map[String,List[String]](
  "a" -> List("aa", "ab", "ac"),
  "b" -> List("ba", "bb")
)

应该成为:

List((a,aa), (a,ab), (a,ac), (b,ba), (b,bb))

我目前正在做的是,你可以找到一个演示here

(for{
  tuple <- mapOfLists
}yield{
  tuple._2.map{ elem =>
    (tuple._1,elem)
  }
}).toList.flatten

它运作得很好,但我认为可以做得更好,是否有完全功能性的方法来做到这一点?

3 个答案:

答案 0 :(得分:3)

 mapOfLists.toList.flatMap({case (k, l) => l.map((k, _))})

答案 1 :(得分:1)

使用具有更简单收益的for comprehension,就像这样

for ( (k,l) <- mapOfLists.toList ; v <- l ) yield (k,v)

答案 2 :(得分:0)

import scala.collection.breakOut

val result: List[(String, String)] = 
   mapOfLists.flatMap({ case (k, l) => l.map(k -> _) })(breakOut)

这样就不会创建中间列表 - flatMap将直接创建结果列表。但是您需要将flatMap调用放入可以推断出正确类型的上下文中,例如使用显式类型的变量赋值。