Как я преобразовываю Карту [Интервал, Кто-либо] к SortedMap в Scala? Или TreeMap?

Я хотел бы преобразовать a Map[Int, Any] к a SortedMap или a TreeMap. Существует ли простой способ сделать это?

38
задан Peter Mortensen 6 May 2013 в 17:37
поделиться

3 ответа

Предполагая, что вы используете неизменяемые карты

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

Метод apply объекта-компаньона TreeMap принимает повторяющиеся параметры входа в карту (которые являются экземплярами Tuple2[_, _] соответствующих типов параметров). toArray создает Array[Tuple2[Int, String]] (в данном конкретном случае). Функция : _* говорит компилятору, что содержимое массива должно рассматриваться как повторяющиеся параметры.

43
ответ дан 27 November 2019 в 03:04
поделиться

Альтернативой использованию : _ * , как описано sblundy, является добавление существующей карты к пустой SortedMap

import scala.collection.immutable.SortedMap
val m = Map(1 -> ("one":Any))
val sorted = SortedMap[Int, Any]() ++ m
45
ответ дан 27 November 2019 в 03:04
поделиться

Вот общий способ преобразования между различными коллекциями 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]
33
ответ дан 27 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: