#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, )