【问题标题】:Sort Bool Array排序布尔数组
【发布时间】:2017-06-22 01:42:14
【问题描述】:

我有一个要排序的布尔数组:

var array = [true,false,true,false]

我不确定如何使用排序方法:

playersArray.sorted(by: (Bool, Bool) -> Bool)

提前致谢

【问题讨论】:

标签: arrays sorting swift3 boolean


【解决方案1】:

方法一:使用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 &lt; falsefalse &gt; true

所以,当第一个输入为真而第二个输入为假时,您想返回true。这可以简单地写成{ $0 &amp;&amp; !$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 倍。

【讨论】:

  • 谢谢你,很棒的解释!
【解决方案2】:

知道了!

array.sorted {$0.description > $1.description}

【讨论】:

  • 这会将每个布尔值转换为字符串。不推荐。
猜你喜欢
  • 2017-02-13
  • 2015-04-14
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2015-05-01
  • 2021-09-21
相关资源
最近更新 更多