2013-04-12 31 views
5

我想對一個scala.collection.immutable.List轉換爲使用新to方法從斯卡拉2.10 scala.collection.immutable.SortedMap,但我得到一個編譯時錯誤:使用Scala的2.10`to`到列表轉換爲一個SortedMap

scala> List((1, "Fred"), (2, "Barney")).to[scala.collection.immutable.SortedMap] 
<console>:10: error: scala.collection.immutable.SortedMap takes two type parameters, expected: one 
       List((1, "Fred"), (2, "Barney")).to[SortedMap] 
               ^

這可以使用to方法完成嗎?我是否缺少中間方法調用?

+2

至於爲什麼這不起作用,這是因爲'.to'僅限於具有單個類型參數(和可用的'CanBuildFrom'隱式):'.to [Col [_]]的目標集合:Col [A]'。這也意味着你不能轉換爲根本沒有類型參數的集合類型,比如'BitSet'。 – gourlaysama

回答

7

@gourlaysama已經解釋了爲什麼它不能編譯,而@Chirlo提供了最簡單(推薦)的解決方法:SortedMap(list: _*)

我想提出一個替代方案:

import collection.Traversable 
import collection.generic.CanBuildFrom 
implicit class RichPairTraversable[A,B](t: Traversable[(A,B)]) { 
    def toPairCol[Col[A,B]](implicit cbf: CanBuildFrom[Nothing, (A,B), Col[A, B]]): Col[A, B] = { 
    val b = cbf() 
    b.sizeHint(t) 
    b ++= t 
    b.result 
    } 
} 

在REPL一些測試:

scala> List((1, "Fred"), (2, "Barney")).toPairCol[scala.collection.immutable.SortedMap] 
res0: scala.collection.immutable.SortedMap[Int,String] = Map(1 -> Fred, 2 -> Barney) 

scala> List((1, "Fred"), (2, "Barney")).toPairCol[scala.collection.immutable.HashMap] 
res1: scala.collection.immutable.HashMap[Int,String] = Map(1 -> Fred, 2 -> Barney) 

現在,我可能不會在生產中使用它,因爲這樣做SortedMap(list: _*)不那 很難並且不需要魔法。

9

我有一個similar question前一段時間,並想出了這個:

SortedMap(list: _*) 

所以,你可以不喜歡它:

val map = SortedMap(List((1, "Fred"), (2, "Barney")): _*) 

_*意味着你採取Seq小號的元素,而不是Seq本身作爲參數。

+0

這實際上是我爲修復我的代碼所做的。我想使用新的'to'方法,但:-)。 – Ralph

+5

實際上'.to'在這裏是不需要的,你可以直接給列表(用':_ *')到'SortedMap()'。 – gourlaysama

+0

對!我最初的問題是從'Iterator'中創建一個'SortedMap',在這種情況下,我確實需要'' – Chirlo

相關問題