29

我有两个列表, aList[A]和 a List[B]。我想要的是 aMap[A,B]但我想要zip. 所以开始是这样的:

var tuplesOfAB = listOfA zip listOfB

现在我不确定如何Map从我的tuplesOfAB.

作为后续问题,我还想反转我的地图,以便Map[A,B]我可以从 a 创建一个Map[B,A]. 谁能用线索棒打我?

4

4 回答 4

35

2.8中,使用CanBuildFrom功能(如 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]
于 2010-02-03T07:31:08.603 回答
15

现在您已经有了一个元组列表,很容易通过编写将其制成地图Map(tuplesOfAB: _*)。该: _*符号表示使用从序列中获取的参数调用可变参数重载。这似乎是一个有趣的语法,但它有助于认为 varargs 被声明为 likeMap[A,B](pairs: (A,B)*)并且由于公共部分: _*是转换为 varargs 的类型注释。*

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

于 2010-02-03T05:02:14.060 回答
6

除了已经展示的方法之外,还有另一种方法可以做到这一点。这里:

Map() ++ tuplesOfAB
于 2010-02-03T11:43:48.567 回答
6
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)
于 2012-05-19T09:08:47.807 回答