【问题标题】:Converting a Scala Map to a List将 Scala 映射转换为列表
【发布时间】:2011-10-23 08:14:15
【问题描述】:

我有一个需要映射到不同类型的映射,结果需要是一个列表。我有两种方法(似乎)来完成我想要的,因为在地图上调用 map 似乎总是会产生地图。假设我有一些看起来像这样的地图:

val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6))

我可以:

val output = input.map{ case(k,v) => (k.getBytes, v) } toList

或者:

val output = input.foldRight(List[Pair[Array[Byte], List[Int]]]()){ (el, res) =>
  (el._1.getBytes, el._2) :: res
}

在第一个示例中,我转换类型,然后调用 toList。我假设运行时类似于O(n*2),所需空间为n*2。在第二个示例中,我将类型转换并一次性生成列表。我假设运行时为O(n),所需空间为n

我的问题是,这些本质上是相同的还是第二次转换减少了内存/时间/等?此外,我在哪里可以找到有关各种 Scala 转换的存储和运行时成本的信息?

提前致谢。

【问题讨论】:

    标签: scala data-structures


    【解决方案1】:

    我最喜欢做这种事情的方式是这样的:

    input.map { case (k,v) => (k.getBytes, v) }(collection.breakOut): List[(Array[Byte], List[Int])]
    

    使用此语法,您将传递给map 重建结果集合所需的构建器。 (实际上,不是构建器,而是构建器工厂。如果您有兴趣,请阅读有关 Scala 的CanBuildFroms 的更多信息。)collection.breakOut 可以在您想在执行map 时从一种集合类型更改为另一种集合类型时使用。 , flatMap 等等——唯一不好的部分是你必须使用完整的类型注释才能使其生效(这里,我在表达式之后使用了类型归属)。然后,没有中间集合被构建,并且列表在 映射时被构建。

    【讨论】:

    【解决方案2】:

    在第一个示例中映射视图可以减少大地图的空间需求:

    val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList
    
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多