bma*_*eny 28 scala data-structures
我有一个我需要映射到不同类型的地图,结果需要是一个List.我有两种方式(看似)可以实现我想要的,因为在地图上调用地图似乎总是会产生地图.假设我有一些看起来像的地图:
val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6))
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
val output = input.map{ case(k,v) => (k.getBytes, v) } toList
Run Code Online (Sandbox Code Playgroud)
要么:
val output = input.foldRight(List[Pair[Array[Byte], List[Int]]]()){ (el, res) =>
(el._1.getBytes, el._2) :: res
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,我转换了类型,然后调用toList.我假设运行时是类似的O(n*2),所需的空间是n*2.在第二个示例中,我转换类型并一次生成列表.我假设运行时是,O(n)并且所需的空间是n.
我的问题是,这些基本相同还是第二次转换会减少内存/时间/等?此外,在哪里可以找到有关各种scala转换的存储和运行时成本的信息?
提前致谢.
Jea*_*let 27
我最喜欢做这种事情的方式是这样的:
input.map { case (k,v) => (k.getBytes, v) }(collection.breakOut): List[(Array[Byte], List[Int])]
Run Code Online (Sandbox Code Playgroud)
使用此语法,您将传递map到重构结果集合所需的构建器.(其实,不是一个建设者,但建设者工厂了解更多关于Scala的.CanBuildFrom■如果你有兴趣.)collection.breakOut可以准确地被使用,当你想同时做一个从一个集合类型更改为另一种map,flatMap等等-唯一不好的部分是你必须使用完整类型注释才能生效(这里,我在表达式之后使用了类型归属).然后,没有构建中间集合,并且在映射时构建列表.
Ben*_*mes 24
在第一个示例中对视图进行映射可以减少大型地图的空间需求:
val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35148 次 |
| 最近记录: |