将Scala Map转换为列表
发布时间:2020-12-16 09:43:09 所属栏目:安全 来源:网络整理
导读:我有一张地图,我需要映射到一个不同的类型,结果需要一个列表。我有两种方式(貌似)完成我想要的,因为在地图上调用地图似乎总是导致地图。假设我有一些地图看起来像: val input = Map[String,List[Int]]("rk1" - List(1,2,3),"rk2" - List(4,5,6)) 我可以
我有一张地图,我需要映射到一个不同的类型,结果需要一个列表。我有两种方式(貌似)完成我想要的,因为在地图上调用地图似乎总是导致地图。假设我有一些地图看起来像:
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) }(collection.breakOut): List[(Array[Byte],List[Int])] 使用此语法,您将传递映射其需要重建生成的集合的构建器。 (实际上,不是一个建设者,而是一个建设工厂。如果你有兴趣,请阅读更多关于Scala的CanBuildFroms)。在做map,flatMap等时,想要从一个集合类型更改为另一个集合类型时,可以使用collection.breakOut。 – 唯一不好的部分是你必须使用完整的类型注释才能生效(在这里,我在表达式之后使用了类型归属)。然后,没有建立中间集合,列表是在映射时构建的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |