2013-03-02 43 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] 
        ^