Подтвердить что ты не робот

Преобразовать список Ints в SortedSet в Scala

Если у меня есть список Ints вроде:

val myList = List(3,2,1,9)

Каков правильный/предпочтительный способ создания SortedSet из списка или Seq of Ints, где элементы сортируются от наименьшего к наибольшему?

Если бы ты держал пистолет в голову, я бы сказал:

val itsSorted = collection.SortedSet(myList)

но я получаю сообщение об ошибке, что для List [Int] нет неявного упорядочения.

4b9b3361

Ответ 1

Использование:

collection.SortedSet(myList: _*)

Как вы его использовали, компилятор считает, что вы хотите создать SortedSet[List[Int]] не a SortedSet[Int]. Вот почему он жалуется на неявный порядок для List[Int].

Обратите внимание на повторяющийся параметр типа A* в сигнатуре метода:

def apply [A] (elems: A*)(implicit ord: Ordering[A]): SortedSet[A]

Для обработки myList в качестве аргумента последовательности A используйте аннотацию типа _*.

Ответ 2

Вы также можете воспользоваться экземпляром CanBuildFrom и сделать это:

val myList = List(3,2,1,9)
myList.to[SortedSet]
// scala.collection.immutable.SortedSet[Int] = TreeSet(1, 2, 3, 9)

Ответ 3

Кажется, что не существует конструктора, который принимает непосредственно List (исправьте меня, если я ошибаюсь). Но вы можете легко написать

val myList = List(3,2,1,9)
val itsSorted = collection.SortedSet.empty[Int] ++ myList

к тому же эффекту. (См. http://www.scala-lang.org/docu/files/collections-api/collections_20.html.)

Ответ 4

Это особенно полезно, если вам все равно нужно сопоставить:

import scala.collection.breakOut

val s: collection.SortedSet[Int] = List(1,2,3,4).map(identity)(breakOut)
//--> s: scala.collection.SortedSet[Int] = TreeSet(1, 2, 3, 4)