如何在 Swift 的布尔数组中找到多个 True 语句

Posted

技术标签:

【中文标题】如何在 Swift 的布尔数组中找到多个 True 语句【英文标题】:How can I find a number of True statements in an Array of Bools in Swift 【发布时间】:2017-02-20 10:46:06 【问题描述】:

我是一名新开发人员,似乎无法弄清楚如何在布尔数组中找到 True 语句的数量。我知道如何按索引而不是按值查找。任何帮助将不胜感激。

let arrayElement = [Bool](repeating: false, count: 10)
var before: [[Bool]] = [[Bool]](repeating: arrayElement, count:10)
for i in 0 ..< 10 
    for j in 0 ..< 10 
        if arc4random_uniform(3) == 1 
            before[i][j] = true  
                
    

【问题讨论】:

【参考方案1】:

计算一维数组中true条目数的方法

一种方法是过滤您的 Bool 元素数组(对于 true)并简单地计算过滤后数组中剩余元素的数量

let arr = [false, true, true, false, true]
let numberOfTrue = arr.filter$0.count
print(numberOfTrue) // 3

另一种方法是reduce(展开)数组并为每个等于true的元素增加一个计数器

let arr = [false, true, true, false, true]
let numberOfTrue = arr.reduce(0)  $0 + ($1 ? 1 : 0) 
print(numberOfTrue) // 3

或者,传统的for 循环(带有条件循环签名)方法,与reduce 方法相当:

let arr = [false, true, true, false, true]
var trueCounter = 0
for bElem in arr where bElem  trueCounter += 1 
print(trueCounter) // 3

应用于你的例子:使用joined()实现一维数组

上述方法可以很容易地应用于数组数组(Bool 元素:类型[[Bool]]),只需在[[Bool]] 数组上应用.joined() 以顺序构造[Bool] 数组。

/* 'before' is of type [[Bool]], constructed as described
   in the question */
let numberOfTrueAlt1 = before.joined().filter$0.count

let numberOfTrueAlt2 = before.joined().reduce(0)  $0 + ($1 ? 1 : 0) 

var numberOfTrueAlt3 = 0
for bElem in before.joined() where bElem  numberOfTrueAlt3 += 1 

【讨论】:

【参考方案2】:

由于您正在处理一个数组数组,因此计算也将有两个步骤。首先使用map将每个内部数组转换为其真值计数,然后与reduce聚合得到最终结果:

let countTrue = before.map $0.filter$0.count.reduce(0, +)

【讨论】:

以上是关于如何在 Swift 的布尔数组中找到多个 True 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中切换布尔数组?

比较 2 个数组并列出差异 - Swift

比较2个数组并列出差异 - Swift

如何识别布尔数组中的值序列?

如何读取数组中所有函数的布尔值(真/假)

当您在 Swift 中有嵌套函数时,如何将布尔值返回给外部函数?