我有一个 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.breakOut
,map
等的同时从一种集合类型更改为另一种集合类型时,可以精确地使用flatMap
。唯一的缺点是您必须使用完整的类型注释才能使其生效(此处,在表达式后使用了类型注释)。然后,没有构建任何中间集合,并且在映射时构造了列表。
关于scala - 将Scala映射转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998676/