簡體   English   中英

如何將Map [Int,Any]轉換為Scala中的SortedMap?還是TreeMap?

[英]How do I convert a Map[Int, Any] to a SortedMap in Scala? Or a TreeMap?

我想將Map[Int, Any]轉換為SortedMapTreeMap 有一個簡單的方法嗎?

如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM