如何在Scala中解构字符串长度(降序)的排序方法?

tim*_*man 2 sorting scala

我遇到了这段代码,它按长度降序对一组字符串进行排序:

words.sortBy(x => -x.length)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解-前面的目的是什么,x并逐段解构这段代码吗?它代表“反向”操作吗?我知道这是整数运算,但我很难弄清楚算法在后台是如何工作的。这也可以被视为冒泡排序吗?

Mat*_*zok 6

如果你有:

val collection: SomeCollection[A]
val keyToSortBy A => B
Run Code Online (Sandbox Code Playgroud)

当你这样做时:

collection.sortBy(keyToSortBy)
Run Code Online (Sandbox Code Playgroud)

发生的事情是 Scala 将Ordering[B]在其隐式范围内查找(如果您还不熟悉隐式,请阅读隐式),并且它将使用此接口提供的方法通过排序算法比较元素。

sortBy将用于Ordering[X]按升序对事物进行排序(想想Comparator您是否了解 Java)。因为Ordering[Int]它只是整数的递增顺序,因为Ordering[String]你有一个Strings.

这里-所做的是在将值传递给算法排序Int和否定它之前取值。如果你看到一些例子会更容易:

List("a", "bb", "ccc").sortBy(word => word.length)
// imagine that what it does is:
// - building a collection of pairs ("a", 1), ("bb", 2), ("ccc", 3)
//   ( (value from collection, what function returned for that value) )
// - sorting by the second element of pair
//   using normal Int comparison to get ascending result
// - take only the first element of each pair: ("a", 1), ("bb", 2), ("ccc", 3)
List("a", "bb", "ccc") // result
Run Code Online (Sandbox Code Playgroud)

如果我们把-它放在那里,什么Ordering会得到 Compate 会有所不同:

List("a", "bb", "ccc").sortBy(word => -word.length)
// - building a collection of pairs ("a", -1), ("bb", -2), ("ccc", -3)
// - sorting by the second element of pair - notice that all are negative now!!!
//   using normal Int comparison to get ascending result
// - take only the first element of each pair: ("ccc", -3), ("bb", -2), ("a", -1)
List("ccc", "bb", "a") // result
Run Code Online (Sandbox Code Playgroud)