2013-03-02 46 views
3

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

E.g.

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类似的方法)

THX

回答

3

语法明智最有效的应该是to方法在2.10介绍:

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

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

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

效率方面,除非您将类型转换为更常规的集合,否则转换将涉及复制元素。在你的例子中,如果你把列表缓冲区变成缓冲区,然后进入数组缓冲区并不重要 - 你可以直接使用to来做到这一点,因为你会以任何方式将链接列表中的元素复制到数组中。

+0

感谢您的回答。只有一个小问题:a.to [scala.collection.mutable.ArrayBuffer [Int]]应该更改为a.to [scala.collection.mutable.ArrayBuffer],因为ArrayBuffer不带任何类型参数。 – xhudik 2013-03-03 15:41:21

+0

You're正确 - 而数组缓冲区确实带有类型参数,'to'方法采用更高级的类型'Col [_]',并将其实例化为元素'A'的类型。 – axel22 2013-03-04 10:05:56

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] 
        ^