使用Scala 2.10`to`将List转换为SortedMap

Ral*_*lph 5 collections scala type-conversion

我试图使用Scala 2.10中的新方法将scala.collection.immutable.List一对对转换为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]
                                                  ^
Run Code Online (Sandbox Code Playgroud)

可以使用该to方法完成吗?我错过了中间方法调用吗?

Chi*_*rlo 9

我前一段时间遇到过类似的问题并提出了这个问题:

SortedMap( list: _*)
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

val map =  SortedMap( List((1, "Fred"), (2, "Barney")): _*)
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上这里不需要`.to`,你可以直接将列表(用`:_*`)给`SortedMap()`. (5认同)
  • 请注意,SortedMap 对键采用隐式排序。如果您的列表未按键排序,但您想保持列表的顺序,则可以改用 ListMap。 (2认同)

Rég*_*les 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
  }  
}
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

现在,我可能不会在生产中使用它,因为做起来SortedMap( list: _* )并不那么难,并且不需要魔法.