如何将Map [Int,Any]转换为Scala中的SortedMap?还是TreeMap?

Von*_*onn 38 scala

我想将a转换Map[Int, Any]为a SortedMap或a TreeMap.有一个简单的方法吗?

Ben*_*ngs 45

使用:_*sblundy描述的替代方法是将现有地图附加到空SortedMap

import scala.collection.immutable.SortedMap
val m = Map(1 -> ("one":Any))
val sorted = SortedMap[Int, Any]() ++ m
Run Code Online (Sandbox Code Playgroud)

  • 在性能方面,这与其他选项相比如何? (3认同)
  • 我会把它写成`val sorted = SortedMap.empty [Int,Any] ++ m`,因为它写的就像它正在构建一个浪费的空地图,尽管希望编译器足够聪明不要. (2认同)

sbl*_*ndy 43

假设您正在使用不可变映射

val m = Map(1 -> "one")
val t = scala.collection.immutable.TreeMap(m.toArray:_*)
Run Code Online (Sandbox Code Playgroud)

TreeMap同伴对象的应用方法需要重复映射条目的参数(其实例Tuple2[_, _]相应的参数类型).toArray产生Array[Tuple2[Int, String]](在这种特殊情况下).该: _*告诉编译器阵列的内容将被视为重复参数.

  • 这是一个正确的答案.但它显示了scala集合中一个丑陋的一面:它太尴尬了. (4认同)

ret*_*nym 33

这是在各种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
Run Code Online (Sandbox Code Playgroud)

另见这个问题描述collection.breakOut:Scala 2.8 breakOut

挑战

是否可以调整隐含以使其有效?或者这只有在as被添加的情况下才有可能Traversable吗?

"foo".as[Vector]
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 9

开始Scala 2.13,通过工厂建设者应用.to(factory)

Map(1 -> "a", 2 -> "b").to(collection.immutable.SortedMap)
// collection.immutable.SortedMap[Int,String] = TreeMap(1 -> "a", 2 -> "b")
Run Code Online (Sandbox Code Playgroud)
Map(1 -> "a", 2 -> "b").to(collection.immutable.SortedMap)
// collection.immutable.SortedMap[Int,String] = TreeMap(1 -> "a", 2 -> "b")
Run Code Online (Sandbox Code Playgroud)


Tim*_*per 5

您可以使用Scala隐式类执行以下操作:

implicit class ToSortedMap[A,B](tuples: TraversableOnce[(A, B)])
                               (implicit ordering: Ordering[A]) {
  def toSortedMap =
    SortedMap(tuples.toSeq: _*)
}
Run Code Online (Sandbox Code Playgroud)

由于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)
Run Code Online (Sandbox Code Playgroud)

它甚至可以在Tuple2列表上工作,类似于Map:

scala> List(("c", 1), ("b", 3),("a", 6)).toSortedMap
res7: scala.collection.immutable.SortedMap[String,Int] = Map(a -> 6, b -> 3, c -> 1)
Run Code Online (Sandbox Code Playgroud)