Преобразовать список Ints в SortedSet в Scala
Если у меня есть список Ints вроде:
val myList = List(3,2,1,9)
Каков правильный/предпочтительный способ создания SortedSet из списка или Seq of Ints, где элементы сортируются от наименьшего к наибольшему?
Если бы ты держал пистолет в голову, я бы сказал:
val itsSorted = collection.SortedSet(myList)
но я получаю сообщение об ошибке, что для List [Int] нет неявного упорядочения.
Ответы
Ответ 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)