Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解构Scala中字符串长度(降序)的排序方法?_Scala_Sorting - Fatal编程技术网

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

如何解构Scala中字符串长度(降序)的排序方法?,scala,sorting,Scala,Sorting,我遇到了这段代码,它按长度降序排列字符串集合: words.sortBy(x => -x.length) 有人能帮我理解-在x前面的-的目的是什么,并逐一解构这个代码吗?它代表“反向”操作吗?我知道这是整数运算,但我很难弄清楚算法在后台是如何工作的。 这也可以被视为冒泡排序吗?如果您有: val collection: SomeCollection[A] val keyToSortBy A => B 当您这样做时: collection.sortBy(keyToSortBy)

我遇到了这段代码,它按长度降序排列字符串集合:

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

如果您有:

val collection: SomeCollection[A]
val keyToSortBy A => B
当您这样做时:

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

sortBy
将使用
Ordering[X]
按升序对事物进行排序(如果您了解Java,请考虑
Comparator
)。对于
Ordering[Int]
来说,它只是增加整数的顺序,对于
Ordering[String]
来说,你有一个
字符串的词法顺序

这里,
-
所做的是在将值传递给算法之前,将其按
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
如果我们把
-
放在那里,那么
订购
会给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

sortBy
接受一个函数,该函数将输入集合中的每个元素转换为确定元素升序排序顺序的内容。在本例中,您将按照单词的长度对单词进行排序。由于排序是升序,长度是数字,这意味着它将以较小的长度开始。但是,您希望它们按降序排列,因此一个选项是使用反向排序,或者只是将长度设为负数,然后长度越大,它就越小,这样最终的排序结果就会按降序排列。@luis so=>按照sortBy方法,默认情况下以最小的数字开始,然后查找下一个最大的?与排序无关。这是lambda(和匿名函数)的语法。当我读到Krever的tweet:D()@MateuszKubuszok时,我怀疑有人会对这一点感到疑惑:你找到我了!你说得对。