在Scala中,有没有办法将两个列表转换为Map?

And*_*ull 27 scala tuples list map scala-2.8

我有两个列表,a List[A]和a List[B].我想要的是一个,Map[A,B]但我想要的语义zip.所以从这样开始:

var tuplesOfAB = listOfA zip listOfB
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何构建一个Map来自我的tuplesOfAB.

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

oxb*_*kes 32

在2.8中,使用CanBuildFrom函数(如Daniel所述)并使用breakOut类型指令向编译器使用结果类型应该是什么,这非常简单:

import scala.collection.breakOut
val m = (listA zip listB)(breakOut): Map[A,B]
Run Code Online (Sandbox Code Playgroud)

以下也可以:

val n: Map[A,B] = (listA zip listB)(breakOut)
Run Code Online (Sandbox Code Playgroud)

并且(正如EastSun,下面,已经指出)这已被添加到库中 toMap

val o = (listA zip listB).toMap
Run Code Online (Sandbox Code Playgroud)

至于倒转地图,你可以这样做:

val r = m.map(_.swap)(breakOut): Map[B, A]
Run Code Online (Sandbox Code Playgroud)

  • val m =(listA zip listB)toMap也适用于scala 2.8 (5认同)

Geo*_*edy 15

现在你已经有了一个元组列表,很容易通过写入将它变成一个映射Map(tuplesOfAB: _*).该: _*符号表示调用从序列拍摄参数的可变参数超载.这似乎是一个有趣的语法,但它有助于认为varargs被声明为Map[A,B](pairs: (A,B)*)和: _*由于共同的*部分,是一个类型注释转换为varargs .

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


Ash*_*win 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)
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 5

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

Map() ++ tuplesOfAB
Run Code Online (Sandbox Code Playgroud)