Преобразование списка целых чисел в SortedSet в Scala

Если у меня есть список целых чисел, например:

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

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

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

val itsSorted = collection.SortedSet(myList)

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


person Andy    schedule 13.07.2011    source источник


Ответы (4)


Использовать:

collection.SortedSet(myList: _*)

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

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

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

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

person huynhjl    schedule 13.07.2011
comment
Я надеялся, что у применения есть перегрузка, чтобы взять коллекцию/итерацию типа x. Оглядываясь назад, как это могло быть. Я не сказал, какой тип SortedSet мне нужен. - person Andy; 14.07.2011

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

val myList = List(3,2,1,9)
myList.to[SortedSet]
// scala.collection.immutable.SortedSet[Int] = TreeSet(1, 2, 3, 9)
person Ben Challenor    schedule 01.06.2013
comment
Рекомендуемый способ теперь myList.iterator.to[SortedSet] - person rleibman; 12.02.2021

Кажется, не существует конструктора, который напрямую принимает 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.)

person Mechanical snail    schedule 13.07.2011
comment
Это решение, на которое я наконец наткнулся ранее. Это просто не кажется идиоматичным :) - person Andy; 14.07.2011
comment
Хорошее решение, избегающее необходимости явно вводить неявный порядок. Я думаю, дело не в том, что решение не идиоматично, а в том, что библиотека коллекций scala не предоставляет разработчику идиоматический API. Что довольно неудачно для scala. - person matanster; 14.04.2016

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

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)
person Landei    schedule 13.07.2011