我有两个名单,一个List[A]
和一个List[B]
。我想要的是Map[A,B]
但我想要zip
的语义。于是开始了,像这样:在斯卡拉,有没有办法将两个列表转换为Map?
var tuplesOfAB = listOfA zip listOfB
现在我不知道如何从我的tuplesOfAB
构建Map
。
作为后续问题,我也想反转我的地图,以便从Map[A,B]
我可以创建一个Map[B,A]
。任何人都可以用线索打我?
我有两个名单,一个List[A]
和一个List[B]
。我想要的是Map[A,B]
但我想要zip
的语义。于是开始了,像这样:在斯卡拉,有没有办法将两个列表转换为Map?
var tuplesOfAB = listOfA zip listOfB
现在我不知道如何从我的tuplesOfAB
构建Map
。
作为后续问题,我也想反转我的地图,以便从Map[A,B]
我可以创建一个Map[B,A]
。任何人都可以用线索打我?
在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]
val m =(listA zip listB)toMap 也适用于scala 2.8 – Eastsun 2010-02-03 10:42:51
啊!这个方法在2.8版本中并不存在,我有(r20327) – 2010-02-03 10:48:19
是的,它最近在paulp显示写入它是多么容易,以回应另一个问题后添加。然后他建议将它添加到库中,因为其他主要的集合已经被代表。 – 2010-02-03 11:41:37
现在你已经有了一个元组列表,通过编写Map(tuplesOfAB: _*)
可以很容易地将它制作成地图。 : _*
表示法意味着使用从序列中获取的参数来调用可变参数。这看起来像是一个有趣的语法,但它有助于认为可变参数声明为Map[A,B](pairs: (A,B)*)
,并且: _*
是一种类型注释,因为常见的*
部分转换为可变参数。
要倒转地图m
使用Map(m.map(_.swap): _*)
。在scala中,地图也是对的集合。这通过交换元素并将它们传递给Map构造函数来转换这些对。
太好了,谢谢! – 2010-02-03 17:22:31
还有另一种方式来做到这一点,除了已经显示的那些。在这里:
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)
感谢您问这个。我来到这里找到它。现在我不必自己问。 – wheaties 2010-03-17 16:12:47