Как я могу найти количество истинных утверждений в массиве Bools в Swift

#arrays #swift #boolean

#массивы #swift #логическое

Вопрос:

Я новый разработчик и, похоже, не могу понять, как найти количество истинных утверждений в массиве логических значений. Я знаю, как найти по индексу, но не по значению. Буду признателен за любую помощь.

 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]] ), просто применив .joined() к [[Bool]] массиву для последовательного построения [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,  )