在Scala中,有没有办法将两个列表转换为Map?

时间:2010-02-03 04:52:15

标签: list scala map scala-2.8 tuples

我有两个列表,List[A]List[B]。我想要的是Map[A,B],但我想要zip的语义。所以就这样开始:

var tuplesOfAB = listOfA zip listOfB

现在我不确定如何从Map构建tuplesOfAB

作为后续问题,我还想反转我的地图,以便从Map[A,B]我可以创建Map[B,A]。任何人都可以用线索打我?

4 个答案:

答案 0 :(得分:27)

2.8 中,使用CanBuildFrom功能(as described by Daniel)并使用带有指令breakOut非常简单编译器应该是什么结果类型:

import scala.collection.breakOut
val m = (listA zip listB)(breakOut): Map[A,B]

以下内容也适用:

val n: Map[A,B] = (listA zip listB)(breakOut)

并且(正如EastSun,下面已指出)已将此作为toMap

添加到库中
val o = (listA zip listB).toMap

至于倒转地图,你可以这样做:

val r = m.map(_.swap)(breakOut): Map[B, A]

答案 1 :(得分:15)

现在你已经有了一个元组列表,通过编写Map(tuplesOfAB: _*)可以很容易地将它变成地图。 : _*表示法意味着使用从序列中获取的参数调用varargs重载。这似乎是一个有趣的语法,但它有助于认为varargs被声明为Map[A,B](pairs: (A,B)*): _*是一个类型注释转换为varargs,因为常见的*部分。

要反转地图m,请使用Map(m.map(_.swap): _*)。在scala中,地图也是对的集合。这会通过交换元素并将它们传递给Map构造函数来转换这些对。

答案 2 :(得分:5)

还有另一种方法,除了那些已经显示的方法。这里:

Map() ++ tuplesOfAB

答案 3 :(得分:4)

scala> List( "a", "f", "d") zip List(7, 5, 4, 8) toMap
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4)