我想将Map[Int, Any]
转换为SortedMap
或TreeMap
。有没有简单的方法呢?
答案 0 :(得分:43)
假设您正在使用不可变地图
val m = Map(1 -> "one")
val t = scala.collection.immutable.TreeMap(m.toArray:_*)
TreeMap
伴随对象的apply方法需要重复的映射条目参数(它们是相应参数类型的Tuple2[_, _]
的实例)。 toArray
生成Array[Tuple2[Int, String]]
(在此特定情况下)。 : _*
告诉编译器数组的内容将被视为重复参数。
答案 1 :(得分:42)
使用sblundy描述的:_*
的替代方法是将现有地图附加到空SortedMap
import scala.collection.immutable.SortedMap
val m = Map(1 -> ("one":Any))
val sorted = SortedMap[Int, Any]() ++ m
答案 2 :(得分:32)
这是在各种Scala集合之间进行转换的一般方法。
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
另请参阅此问题,说明collection.breakOut
:Scala 2.8 breakOut
<强> CHALLENGE 强>
是否可以调整隐含以使其有效?或者只有在as
添加Traversable
后才能实现这一目标?
"foo".as[Vector]
答案 3 :(得分:4)
这是一种使用Scala隐式类来实现的方法:
implicit class ToSortedMap[A,B](tuples: TraversableOnce[(A, B)])
(implicit ordering: Ordering[A]) {
def toSortedMap =
SortedMap(tuples.toSeq: _*)
}
由于Map [A,B]具有TraversableOnce [Tuple2 [A,B]]的隐式路径,因此以下工作:
scala> Map("b" -> 3, "c" -> 3, "a" -> 5).toSortedMap
res6: scala.collection.immutable.SortedMap[String,Int] = Map(a -> 5, b -> 3, c -> 3)
它甚至可以在Tuple2列表上工作,类似于toMap:
scala> List(("c", 1), ("b", 3),("a", 6)).toSortedMap
res7: scala.collection.immutable.SortedMap[String,Int] = Map(a -> 6, b -> 3, c -> 1)
答案 4 :(得分:2)
由于实现中的内部数据结构完全不同,因此无论如何都必须逐个添加元素。所以,明确地做:
val m = Map(1 -> "one")
var t = scala.collection.immutable.TreeMap[Int,String]()
t ++= m
答案 5 :(得分:0)
通过.to(factory)
所应用的工厂建造者来开始Scala 2.13
:
Map(1 -> "a", 2 -> "b").to(collection.immutable.SortedMap)
// collection.immutable.SortedMap[Int,String] = TreeMap(1 -> "a", 2 -> "b")
Map(1 -> "a", 2 -> "b").to(collection.immutable.TreeMap)
// collection.immutable.TreeMap[Int,String] = TreeMap(1 -> "a", 2 -> "b")