我有一系列布尔人,我想分类:
var array = [true,false,true,false]
我不确定如何使用排序方法:
playersArray.sorted(by: (Bool, Bool) -> Bool)
提前致谢
答案 0 :(得分:2)
方法1:使用sorted
使用最小闭包
如果您要使用sorted
,并且希望true
成为第一个,则可以将其写为:
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且第二个输入为false时,您希望返回true
。这可以简单地写成{ $0 && !$1 }
。
方法2:基数排序
由于只有2个值,因此只计算其中一个值然后创建一个具有正确数量的true
s和false
s的数组会更有效。这将以线性时间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
倍。
答案 1 :(得分:0)
得到了它!
array.sorted {$0.description > $1.description}