Конвертировать список Ints в SortedSet в Scala - PullRequest
22 голосов
/ 13 июля 2011

Если у меня есть список значений, например:

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

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

Если бы ты приставил пистолет к моей голове, я бы сказал:

val itsSorted = collection.SortedSet(myList)

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

Ответы [ 4 ]

39 голосов
/ 13 июля 2011

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

collection.SortedSet(myList: _*)

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

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

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

Чтобы трактовать myList как аргумент последовательности A, используйте _*Тип аннотации.

12 голосов
/ 01 июня 2013

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

val myList = List(3,2,1,9)
myList.to[SortedSet]
// scala.collection.immutable.SortedSet[Int] = TreeSet(1, 2, 3, 9)
8 голосов
/ 13 июля 2011

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

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

с тем же эффектом.(См. http://www.scala -lang.org / document / files / collection-api / collection_20.html .)

3 голосов
/ 13 июля 2011

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

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