加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

将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。 – 唯一不好的部分是你必须使用完整的类型注释才能生效(在这里,我在表达式之后使用了类型归属)。然后,没有建立中间集合,列表是在映射时构建的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读