我有两个列表, aList[A]
和 a List[B]
。我想要的是 aMap[A,B]
但我想要zip
. 所以开始是这样的:
var tuplesOfAB = listOfA zip listOfB
现在我不确定如何Map
从我的tuplesOfAB
.
作为后续问题,我还想反转我的地图,以便Map[A,B]
我可以从 a 创建一个Map[B,A]
. 谁能用线索棒打我?
在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]
现在您已经有了一个元组列表,很容易通过编写将其制成地图Map(tuplesOfAB: _*)
。该: _*
符号表示使用从序列中获取的参数调用可变参数重载。这似乎是一个有趣的语法,但它有助于认为 varargs 被声明为 likeMap[A,B](pairs: (A,B)*)
并且由于公共部分: _*
是转换为 varargs 的类型注释。*
要反转地图,请m
使用Map(m.map(_.swap): _*)
. 在 scala 中,地图也是对的集合。这通过交换元素并将它们传递给 Map 构造函数来转换这些对。
除了已经展示的方法之外,还有另一种方法可以做到这一点。这里:
Map() ++ tuplesOfAB
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)