【问题标题】:Scala Map from tuple iterable来自元组可迭代的Scala Map
【发布时间】:2011-09-25 05:35:49
【问题描述】:

从其他集合中构建scala.collection.Map,我不断发现自己在写作:

val map = Map(foo.map(x=>(x, f(x)))

但是,这并没有真正起作用,因为 Map.apply 只接受可变参数 - 所以我必须写:

val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)

得到我想要的,但这似乎很痛苦。有没有更漂亮的方法从元组的Iterable 构造Map

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    如果 Traversable/Iterable 的元素是 Tuple2 类型,则使用 TraversableOnce.toMap(API)

    val map = foo.map(x=>(x, f(x)).toMap
    

    【讨论】:

    • 或者,foo.mapValues(f).toMap
    • @missingfaktor mapValues 是 Map 以外的类的方法吗?
    • @mayonesa,不,但我想我当时不知道更好! :)
    【解决方案2】:

    或者,您可以使用 collection.breakOut 作为 map 调用的隐式 CanBuildFrom 参数;这将根据预期类型选择结果生成器。

    scala> val x: Map[Int, String] = (1 to 5).map(x => (x, "-" * x))(collection.breakOut)
    x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)
    

    它将比.toMap 版本执行得更好,因为它只迭代集合一次。

    这不是很明显,但这也适用于理解。

    scala> val x: Map[Int, String] = (for (i <- (1 to 5)) yield (i, "-" * i))(collection.breakOut)
    x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)
    

    【讨论】:

    • 谢谢你 - 虽然我不会在其他人必须阅读的代码中使用它而不粘贴指向CanBuildFrom疯狂的众多解释的链接,它是 对于我想将不可变范围转换为mutable.Map 的情况很有用,我之前接受的答案只是给我一个类型错误。
    【解决方案3】:
    val map = foo zip (foo map f) toMap
    

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2013-01-13
      • 2013-09-11
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多