【发布时间】:2017-06-22 01:42:14
【问题描述】:
我有一个要排序的布尔数组:
var array = [true,false,true,false]
我不确定如何使用排序方法:
playersArray.sorted(by: (Bool, Bool) -> Bool)
提前致谢
【问题讨论】:
标签: arrays sorting swift3 boolean
我有一个要排序的布尔数组:
var array = [true,false,true,false]
我不确定如何使用排序方法:
playersArray.sorted(by: (Bool, Bool) -> Bool)
提前致谢
【问题讨论】:
标签: arrays sorting swift3 boolean
方法一:使用sorted,并带有最小的闭包
如果您要使用sorted,并且希望trues 排在第一位,则可以写为:
let sorted = array.sorted { $0 && !$1 }
说明
您提供给sorted 的闭包需要2 个Bool 并返回一个Bool。根据您提供的闭包,这里有一个表格,将 2 Bool 的输入映射到所需的输出:
input desired answer
------------- --------------
false < true false
true < false true
false < false false
true < true false
因为您希望 true 首先出现在您的数组中,然后是 true < false 和 false > true。
所以,当第一个输入为真而第二个输入为假时,您想返回true。这可以简单地写成{ $0 && !$1 }。
方法二:基数排序
由于只有 2 个值,因此只计算其中一个值然后创建一个具有正确数量的 trues 和 falses 的数组会更有效。这将在线性时间 O(n) 内运行,这比对大型数组的排序要快。
let trueCount = array.reduce(0) { $0 + ($1 ? 1 : 0) }
let sorted = Array(repeating: true, count: trueCount) +
Array(repeating: false, count: array.count - trueCount)
性能比较
这是在 2.4GHz i5 MacBook Pro 上运行的 10,000 元素阵列上的 3 种方法的比较。这是在发布模式下编译的:
sorting function time for 100 runs (seconds)
---------------- --------------
Your answer 0.44872701
Method 1 0.18970698
Method 2 0.00229198
基数排序方法大约快82 倍。
【讨论】:
知道了!
array.sorted {$0.description > $1.description}
【讨论】: