1

一个列表可以迭代如下:

scala> val thrill = "Will" :: "fill" :: "until" :: Nil
val thrill: List[String] = List(Will, fill, until)
scala> thrill.map(s => s + "y")
val res14: List[String] = List(Willy, filly, untily)

上面的代码首先创建一个列表,然后第二个命令创建一个映射,其中包含一个称为“s”的可迭代对象,该映射通过附加字符“y”从“s”创建一个新字符串。

但是,我不明白以下迭代过程:

scala> thrill.sortWith((s,t) => s.charAt(0).toLower < t.charAt(0).toLower)
val res19: List[String] = List(fill, until, Will)

元组是否一次(s,t)取两个元素thrill并比较它们?如何使用此语法/函数准确执行排序?

4

2 回答 2

0

排序是按升序或降序排列数据。排序后的数据有助于我们轻松搜索。Scala 使用TimSort,它是合并排序和插入排序的混合体。

这是scala中sortWith函数的签名-

def sortWith(lt: (A, A) => Boolean): Repr

sortWith函数根据比较函数对该序列进行排序它需要一个比较器功能并根据它进行排序。您可以提供自己的自定义比较功能。

它将对输入列表执行Tim Sort以结果排序输出。

于 2021-05-07T06:23:31.923 回答
0

是的,该函数一次比较两个元素以确定它们的ordering.

的实现依赖于具有以下签名的sortWithJava Array.sort (docs)

sort(T[] a, Comparator<? super T> c)

它接受一个Array of T和一个比较器,配备一个二进制函数,可以比较一组可能值的任何两个元素,T并为您提供一些关于它们如何相互关联的信息(如应该在之前、相同或之后基于你的功能)。

在幕后,它实际上只是一个迭代合并排序的详细信息,可以在维基百科页面上找到合并排序

抛开优化不谈,如果您不熟悉它,合并排序是一种分而治之的算法,它会简单地分解您拥有的集合,直到您拥有 2 个元素的组,然后以排序的方式简单地合并较小的列表通过一次比较 2 个元素,这是您传入的二进制比较函数发挥作用的地方。

IE

List(4, 11, 2, 1, 9, 0) //original list

分解成块:

[4, 11], [2, 1], [9, 0]

内部排序:

[4, 11], [1, 2], [0, 9]

合并:

[1, 4, 11], [2], [0, 9]
[1, 2, 4, 11], [0, 9]
[0, 1, 2, 4, 11], [9]
[0, 1, 2, 4, 9, 11]

PS 一个挑剔的细节, sortedWith 接受一个Function2(arity 2的函数)。您传入的这个函数用于在 Scala 中生成我们所说的 an Ordering,然后将其隐式转换为Comparator. 上面,我已经链接到sorted哪个实现,sortedWith一旦它生成它就会调用它ordering,并且大多数排序逻辑发生在哪个地方。

于 2021-05-07T03:00:38.690 回答