3

不同 scala.collection 对象之间最有效的转换方式是什么?

例如

 val a=scala.collection.mutable.ListBuffer(1,2,0,3)

我想得到scala.collection.mutable.ArrayBuffer.

  1. 根据http://docs.scala-lang.org/resources/images/collections.mutable.png应该可以通过转换为BufferArrayBuffer之后。正确的?

  2. 一般来说,我可以通过它的共同祖先在 scala 集合中进行任何转换吗?(在前面的例子中,共同祖先是Buffer

PS我阅读了http://docs.scala-lang.org/overviews/collections/introduction.html,但找不到关于各种类型之间一般转换的任何信息(我知道.toArray之类的方法)

谢谢

4

2 回答 2

3

语法上最有效的应该是to2.10 中引入的方法:

def to[Col[_]]: Col[A]

通过复制所有元素将此集合转换为另一个集合。注意:对于无限大小的集合不会终止。

将其用作a.to[scala.collection.mutable.ArrayBuffer].

效率方面,除非您进行类似向上转换的转换,将子类型转换为更通用的集合,否则转换将涉及复制元素。在您的示例中,将列表缓冲区转换为缓冲区然后转换为数组缓冲区并不重要——您可以直接使用 执行此操作to,因为您会导致将元素从链表复制到数组中。

于 2013-03-02T17:22:38.200 回答
1

回答第 2 题:

Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_07).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import collection.mutable._
import collection.mutable._

scala> List(1,2,3,4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)

scala> res0.to[ArrayBuffer]
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)

scala> res0.to[ListBuffer]
res2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)

只要保持兼容性,您就可以随意转换它们:

scala> res0.to[Map]
<console>:12: error: scala.collection.mutable.Map takes two type parameters, expected: one
              res0.to[Map]
                      ^
于 2013-03-02T17:23:26.667 回答