scala - 将Scala映射转换为列表

标签 scala data-structures

我有一个 map ,我需要将其映射到其他类型,并且结果需要是一个列表。我有两种方法(看似)完成我想要的事情,因为在 map 上调用map似乎总是会生成一张 map 。假设我有一些 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转换的存储和运行时成本的信息?

提前致谢。

最佳答案

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

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

使用这种语法,您将把重建结果集合所需的构建器传递给map。 (实际上,不是构建器,而是构建器工厂。如果您有兴趣,请阅读有关Scala的CanBuildFrom的更多信息。)当您要在执行collection.breakOutmap等的同时从一种集合类型更改为另一种集合类型时,可以精确地使用flatMap。唯一的缺点是您必须使用完整的类型注释才能使其生效(此处,在表达式后使用了类型注释)。然后,没有构建任何中间集合,并且在映射时构造了列表。

关于scala - 将Scala映射转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998676/

相关文章:

scala - Steam OpenId 和 Play 框架

algorithm - 节点 s 的子树中值为 x 的节点数?

algorithm - 图和树的DFS区别

c++ - 特定名称的结构导出数据

java - 从继承的 protected Java 字段创建公共(public)访问器

arrays - Scala - 创建指定长度的类型参数化数组

c - 使用双指针而不是单指针

data-structures - 如何确保 Rust 向量仅包含交替类型?

Java 7 : throw exception without stack trace

scala - Spark 执行器上的对象缓存