排序(by:)方法/需要解释

问题描述 投票:0回答:1

在我的学习书中遇到了这个新的“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:)
方法工作的吗?

swift sorting methods syntax closures
1个回答
0
投票

有多种排序算法:冒泡排序、快速排序、归并排序等
它们各有优缺点,主要是关于:内存使用、复杂性等。简而言之:排序时会在内存中创建另一个完整数组或更多数组吗?如果数组很大的话会花费很多时间吗?等等

在另一个 StackOverflow 问题中,您可能会看到似乎使用了哪种算法,并且该算法似乎在过去发生了变化。 明天,算法可能会改变甚至适应(例如:如果元素少于 1k,则执行排序逻辑 1,但如果元素较多,则执行排序逻辑 2,因为它在内存上的成本较低,而且您没有太多 RAM目前等)

但是,由于您想使用高级方法

sort(by:)

,而不是自己实现算法,所以不要关注它。

只需关注在闭包中做什么,这非常简单:

    参数中有 2 个元素
  • 从它们中检索要比较的信息:无论是原始值、计算属性、您想要的另一个相关值等。
  • 比较这两个值:如果您希望将第一个参数放置在第二个参数之前,则返回 true,否则返回 false。
如果需要,您可以打印该值:

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 }
当然,它可以简化或以不同的方式编写,但这是为了使示例更容易理解。

© www.soinside.com 2019 - 2024. All rights reserved.