我有两个列表,List[A]
和List[B]
。我想要的是Map[A,B]
,但我想要zip
的语义。所以就这样开始:
var tuplesOfAB = listOfA zip listOfB
现在我不确定如何从Map
构建tuplesOfAB
。
作为后续问题,我还想反转我的地图,以便从Map[A,B]
我可以创建Map[B,A]
。任何人都可以用线索打我?
答案 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)