从其他集合构建集合的有效方法
Posted
技术标签:
【中文标题】从其他集合构建集合的有效方法【英文标题】:Efficient way to build collections from other collections 【发布时间】:2015-02-27 09:28:56 【问题描述】:在 Scala 中,与许多其他语言一样,可以使用其他集合中包含的元素来构建集合。
例如,可以堆化一个列表:
import scala.collection.mutable.PriorityQueue
val l = List(1,2,3,4)
与:
val pq = PriorityQueue(l:_*)
或:
val pq = PriorityQueue[Int]() ++ l
在我看来,这是两种截然不同的方法:
-
使用可变参数构造函数和
collection:_*
,最终将集合转储到中间数组中。
构建一个空的目标集合并使用++
方法添加所有源集合元素。
从美学的角度来看,我确实更喜欢第一种选择,但我担心collection:_*
。我理解“在 Scala 中编程”的形式,可变参数函数被转换为接收数组的函数。
一般来说,第二个选项在效率方面是否是更好的解决方案?
【问题讨论】:
不是答案,但l.to[PriorityQueue]
也不错。
@TravisBrown 比riorityQueue(l:_*)
更漂亮,没有性能缺陷。太好了!
【参考方案1】:
在某些情况下,第二个可能更快,但显然当原始集合是 Seq(例如您的 List)时,Scala 会尝试避免创建数组;见here。
但是,实际上,除非您在紧密循环中处理大量集合,否则它可能永远不会有所作为。这类事情不值得担心,你喜欢哪一种就去做吧;你可以节省几毫秒。
【讨论】:
您提供的链接确实明确地阐明了该主题。可惜这本书在变参函数的描述上没有多扩展一点。以上是关于从其他集合构建集合的有效方法的主要内容,如果未能解决你的问题,请参考以下文章