【问题标题】:In Scala, is there a way to take convert two lists into a Map?在 Scala 中,有没有办法将两个列表转换为 Map?
【发布时间】:2011-01-12 11:38:26
【问题描述】:

我有两个列表,一个List[A] 和一个List[B]。我想要的是Map[A,B],但我想要zip 的语义。就这样开始了:

var tuplesOfAB = listOfA zip listOfB

现在我不确定如何从我的tuplesOfAB 构造一个Map

作为后续问题,我还想反转我的地图,以便从Map[A,B] 创建一个Map[B,A]。谁能用线索棒打我?

【问题讨论】:

  • 感谢您提出这个问题。我来这里是为了找到它。现在我不必自己问了。

标签: list scala map scala-2.8 tuples


【解决方案1】:

2.8 中,使用 CanBuildFrom 功能 (as described by Daniel) 和使用带有类型 instructionbreakOut 对编译器来说非常简单结果类型应为:

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]

【讨论】:

  • 啊!该方法在我拥有的 2.8 版本中不存在(r20327)
  • 是的,它是最近在 paulp 展示了编写它是多么容易之后添加的,以回应另一个问题。然后他建议将其添加到库中,因为其他所有主要集合都已被表示。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2015-09-04
        • 1970-01-01
        相关资源
        最近更新 更多