2010-02-03 37 views
22

我有两个名单,一个List[A]和一个List[B]。我想要的是Map[A,B]但我想要zip的语义。于是开始了,像这样:在斯卡拉,有没有办法将两个列表转换为Map?

var tuplesOfAB = listOfA zip listOfB 

现在我不知道如何从我的tuplesOfAB构建Map

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

+1

感谢您问这个。我来到这里找到它。现在我不必自己问。 – wheaties 2010-03-17 16:12:47

回答

26

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] 
+4

val m =(listA zip listB)toMap 也适用于scala 2.8 – Eastsun 2010-02-03 10:42:51

+0

啊!这个方法在2.8版本中并不存在,我有(r20327) – 2010-02-03 10:48:19

+1

是的,它最近在paulp显示写入它是多么容易,以回应另一个问题后添加。然后他建议将它添加到库中,因为其他主要的集合已经被代表。 – 2010-02-03 11:41:37

15

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

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

+0

太好了,谢谢! – 2010-02-03 17:22:31

5

还有另一种方式来做到这一点,除了已经显示的那些。在这里:

Map() ++ tuplesOfAB 
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) 
相关问题