我遇到了这段代码,它按长度降序对一组字符串进行排序:
words.sortBy(x => -x.length)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解-前面的目的是什么,x并逐段解构这段代码吗?它代表“反向”操作吗?我知道这是整数运算,但我很难弄清楚算法在后台是如何工作的。这也可以被视为冒泡排序吗?
如果你有:
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)