[英]How do I convert a Map[Int, Any] to a SortedMap in Scala? Or a TreeMap?
我想將Map[Int, Any]
轉換為SortedMap
或TreeMap
。 有一個簡單的方法嗎?
如sblundy所描述的使用:_*
的替代方法是將現有地圖附加到空的SortedMap
import scala.collection.immutable.SortedMap
val m = Map(1 -> ("one":Any))
val sorted = SortedMap[Int, Any]() ++ m
假設您正在使用不可變映射
val m = Map(1 -> "one")
val t = scala.collection.immutable.TreeMap(m.toArray:_*)
TreeMap
伴隨對象的apply方法采用重復的映射條目參數(它們是相應參數類型的Tuple2[_, _]
的實例)。 toArray
生成一個Array[Tuple2[Int, String]]
(在這種特殊情況下)。 : _*
告訴編譯器數組的內容將被視為重復參數。
這是在各種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
挑戰
是否可以調整隱含以使其有效? 或者只有在添加到Traversable
時才可能這樣as
?
"foo".as[Vector]
這是一種使用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)
由於實現中的內部數據結構完全不同,因此無論如何都必須逐個添加元素。 所以,明確地做:
val m = Map(1 -> "one")
var t = scala.collection.immutable.TreeMap[Int,String]()
t ++= m
通過應用.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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.