我有一个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
它运作得很好,但我认为可以做得更好,是否有完全功能性的方法来做到这一点?
答案 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
调用放入可以推断出正确类型的上下文中,例如使用显式类型的变量赋值。