I would like to convert a Map[Int, Any] to a SortedMap or a TreeMap and haven't been able to find an easy way to do it.
Assuming you're using immutable maps
val m = Map(1 -> "one")
val t = scala.collection.immutable.TreeMap(m.toArray:_*)
The TreeMap
companion object's apply method takes repeated map entry parameters (which are instances of Tuple2[_, _]
of the appropriate parameter types). toArray
produces an Array[Tuple2[Int, String]]
(in this particular case). The : _*
tells the compiler that the array's contents are to be treated as repeated parameters.
An alternative to using :_*
as described by sblundy is to append the existing map to an empty SortedMap
import scala.collection.immutable.SortedMap
val m = Map(1 -> ("one":Any))
val sorted = SortedMap[Int, Any]() ++ m
Here's a general way to convert between various Scala collections.
import collection.generic.CanBuildFrom
import collection.immutable.TreeMap
object test {
class TraversableW[A](t: Traversable[A]) {
def as[CC[X] <: Traversable[X]](implicit cbf: CanBuildFrom[Nothing, A, CC[A]]): CC[A] = t.map(identity)(collection.breakOut)
def to[Result](implicit cbf: CanBuildFrom[Nothing, A, Result]): Result = t.map(identity)(collection.breakOut)
}
implicit def ToTraverseableW[A](t: Traversable[A]): TraversableW[A] = new TraversableW[A](t)
List(1, 2, 3).as[Vector]
List(1, 2, 3).to[Vector[Int]]
List((1, 1), (2, 4), (3, 4)).to[Map[Int, Int]]
List((1, 1), (2, 4), (3, 4)).to[TreeMap[Int, Int]]
val tm: TreeMap[Int, Int] = List((1, 1), (2, 4), (3, 4)).to
("foo": Seq[Char]).as[Vector]
}
test
See also this question describing collection.breakOut
: http://stackoverflow.com/questions/1715681/scala-2-8-breakout
CHALLENGE
Is it possible to adjust the implicits such that this works? Or would this only be possible if as
were added to Traversable
?
"foo".as[Vector]
Since internal data structures in implementations are completely different, you'll have to add elements one-by-one anyway. So, do it explicitly:
val m = Map(1 -> "one")
var t = scala.collection.immutable.TreeMap[Int,String]()
t ++= m