将Int列表转换为Scala中的SortedSet

时间:2011-07-13 04:37:39

标签: scala sortedset

如果我有一个Ints列表,如:

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

从Int的List或Seq创建SortedSet的正确/首选方法是什么,其中项目从最小到最大排序?

如果你拿着枪,我会说:

val itsSorted = collection.SortedSet(myList)

但是我得到一个错误,即没有为Lis​​t [Int]定义隐式排序。

4 个答案:

答案 0 :(得分:39)

使用:

collection.SortedSet(myList: _*)

您使用它的方式,编译器认为您要创建SortedSet[List[Int]]而不是SortedSet[Int]。这就是为什么它抱怨List[Int]没有隐式排序。

注意方法签名中A*类型的重复参数:

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

要将myList视为A使用的序列参数,请使用_*类型注释。

答案 1 :(得分:11)

您还可以利用CanBuildFrom实例,并执行此操作:

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

答案 2 :(得分:8)

似乎没有直接接受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。)

答案 3 :(得分:3)

如果你必须要映射,这个特别有用:

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)