5

我正在尝试使用 Scala 2.10 中的新方法将 a scala.collection.immutable.Listof pair 转换为 a ,但出现编译时错误:scala.collection.immutable.SortedMapto

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方法完成吗?我错过了中间方法调用吗?

4

2 回答 2

9

前段时间我有一个类似的问题并想出了这个:

SortedMap( list: _*)

所以你可以这样做:

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

_*意味着您将Seqs 元素而不是Seq自身作为参数。

于 2013-04-12T14:26:34.847 回答
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: _* )并不难,也不需要魔法。

于 2013-04-12T15:48:45.150 回答