2013-04-12 10 views
5

Ich versuche, ein scala.collection.immutable.List von Paaren zu einem scala.collection.immutable.SortedMap konvertieren von Scala 2.10, aber ich erhalte einen Fehler Compile-Zeit mit der neuen to Methode zu konvertieren:Mit Scala 2.10 `to` Liste in 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] 
               ^

Kann dies mit der Methode to durchgeführt werden? Fehle ich einen Zwischenmethodenanruf?

+2

wie für das warum dies nicht funktioniert, ist dies, weil '.to' auf Target-Auflistung beschränkt ist, die einen einzigen Typparameter haben (und eine implizite' CanBuildFrom'): '.to [Col [_]] : Col [A] '. Dies bedeutet auch, dass Sie nicht in einen Sammlertyp konvertieren können, der überhaupt keinen Typparameter enthält, wie zum Beispiel 'BitSet'. – gourlaysama

Antwort

7

@gourlaysama bereits erklärt, warum es nicht kompiliert, und @Chirlo zur Verfügung gestellt die einfachste (und empfohlen) arbeiten um: SortedMap(list: _*).

Ich möchte eine Alternative vorschlagen:

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 
    } 
} 

Einige Test in der 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) 

Jetzt werde ich es wahrscheinlich nicht in der Produktion verwendet werden, da SortedMap(list: _*) tun, ist nicht das hart und erfordert keine Magie.

9

hatte ich einige Zeit similar question vor und kam mit dieser:

SortedMap(list: _*) 

Sie können es also tun:

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

Die _* bedeutet, dass Sie die Elemente s Seq nehmen statt der Seq selbst als Parameter.

+0

Das ist eigentlich, was ich getan habe, um meinen Code zu reparieren. Ich wollte allerdings die neue 'to'-Methode verwenden :-). – Ralph

+5

eigentlich wird das '.to' hier nicht benötigt, Sie können die Liste (mit': _ * ') direkt an' SortedMap() 'übergeben. – gourlaysama

+0

Richtig! Mein ursprüngliches Problem bestand darin, eine "SortedMap" aus einem "Iterator" zu machen, in diesem Fall brauchte ich das 'to' – Chirlo

Verwandte Themen