sorted和sortBy之间的区别

时间:2013-05-07 09:19:21

标签: performance list scala collections time-complexity

根据列表文档

def  sorted[B >: A](implicit ord: math.Ordering[B]): List[A] 
Sorts this list according to an Ordering.


def sortBy[B](f: (A) ⇒ B)(implicit ord: math.Ordering[B]): List[A]

Sorts this List according to the Ordering which results from transforming an implicitly given Ordering with a transformation function.

你何时会使用另一个?你何时会使用另一个?是否覆盖了另一个没有的情景?

3 个答案:

答案 0 :(得分:6)

对于sortBy,你可以提供自定义函数来生成用于排序的元素(例如按长度字符串排序),而对于排序你不能:

val xs = List("aa", "b")
// xs: List[String] = List(aa, b)
xs.sortBy{ str => str.length }
// List[String] = List(b, aa)

// now usual lexicographical sorting
xs.sorted
// List[String] = List(aa, b)
xs.sortBy(x => x)
// List[String] = List(aa, b)
xs.sortBy(identity)
// List[String] = List(aa, b)

如您所见,最后三行的结果相同

答案 1 :(得分:3)

如果您需要考虑多个案例,则可以将sortedOrdering一起使用。假设我们想要在开头对具有最短字符串的以下列表进行排序。

val xs = "aa" :: "b" :: "bb" :: "a" :: Nil

xs.sortBy(_.length)
> List[String] = List(b, a, aa, bb)

如果我们想要按字母顺序对它们进行额外排序,当它们具有相同的长度时,我们可以使用sorted

xs.sorted(math.Ordering[(Int, String)].on((x: String) => (x.length, x)))
> List[String] = List(a, b, aa, bb)

但话说回来,我们可以使用

xs.sortBy(x => (x.length, x))
> List[String] = List(a, b, aa, bb)

我们的想法是,您可以为自己的类型提供Ordering类型类,然后使用具有此类隐式xs.sorted的简单Ordering将适用于最常见的用例。

答案 2 :(得分:0)

作为@ om-nom-nom答案的补充,here是两者典型用法的一个例子:

val xs = List(4, 2, 3, 1)
val ys = List((1, 1), (3, 2), (2, 3))
println(xs.sorted)       // List(1, 2, 3, 4)
println(ys.sortBy(_._1)) // List((1,1), (2,3), (3,2))