在我的学习书中遇到了这个新的“sort(by:)”方法,没有任何合理的解释它如何以及为什么工作,以此作为代码示例:
var numbers = [1, 2, 5, 3, 7, 4, 6, 9, 8]
let sortClosure = { (a: Int, b: Int) -> Bool in
return a < b
}
numbers.sort(by: sortClosure)
print(numbers)
根据我自己的研究,我发现如果a(数组的第一个元素)需要位于b(数组的第二个元素)之前,则闭包返回true并以这种方式对数组进行排序。
但是我的编译器说
return a < b == false
和 return a > b == true
,我不明白为什么,因为 2 怎么可能小于 1?
请帮助我了解我的编译器有什么问题,或者我无法理解它是通过
sort(by:)
方法工作的吗?
有多种排序算法:冒泡排序、快速排序、归并排序等
它们各有优缺点,主要是关于:内存使用、复杂性等。简而言之:排序时会在内存中创建另一个完整数组或更多数组吗?如果数组很大的话会花费很多时间吗?等等
在另一个 StackOverflow 问题中,您可能会看到似乎使用了哪种算法,并且该算法似乎在过去发生了变化。 明天,算法可能会改变甚至适应(例如:如果元素少于 1k,则执行排序逻辑 1,但如果元素较多,则执行排序逻辑 2,因为它在内存上的成本较低,而且您没有太多 RAM目前等)
但是,由于您想使用高级方法sort(by:)
,而不是自己实现算法,所以不要关注它。只需关注在闭包中做什么,这非常简单:
let returnValue = a < b
print("Comparing \(a) vs \(b) and returning: \(returnValue)")
return returnValue
在您的简单情况下,您正在比较原始值,即Int
。所以前面的解释的全文是:
let valueFromAToCompare = a
let valueFromBToCompare = b
return valueFromAToCompare < valueFromBToCompare
这显然可以简化为return a < b
。如果我们的数组中有类似的结构,并且您想根据其数字进行排序:
struct MyStruct {
let number: Int
let subNumber: String
}
关闭将是:
let valueFromAToCompare = a.number
let valueFromBToCompare = b.number
return valueFromAToCompare < valueFromBToCompare
可以简化为:return a.number < b.number
。但正如你所猜测的,以后可能会有更复杂的排序逻辑:比较数字,但如果
number
相等,则比较
subNumber
,因此可以让你放置整个逻辑的闭包:
if a.number == b.number {
return a.subNumber < b.subNumber
} else {
return a.number < b.number
}
当然,它可以简化或以不同的方式编写,但这是为了使示例更容易理解。