Считать элементы в массиве массивов?
Если у меня есть объект, который объявлен как
let compoundArray = [Array<String>]
Есть ли свойство, которое даст мне количество строк во всех массивах, содержащихся в составном массиве?
Я могу сделать это, сложив все элементы в каждом массиве:
var totalCount = 0
for array in compoundArray {
totalCount += array.count }
//totalCount = total items in all arrays within compoundArray
Но это кажется неуклюжим, и кажется, что у swift есть свойство / метод Array для этого, не так ли?
Спасибо!
3 ответа
Вы можете добавить количество вложенных массивов с помощью
let count = compoundArray.reduce(0) { $0 + $1.count }
Сравнение производительности для больших массивов (скомпилированных и запущенных на MacBook Pro в конфигурации Release):
let N = 20_000
let compoundArray = Array(repeating: Array(repeating: "String", count: N), count: N)
do {
let start = Date()
let count = compoundArray.joined().count
let end = Date()
print(end.timeIntervalSince(start))
// 0.729196012020111
}
do {
let start = Date()
let count = compoundArray.flatMap({$0}).count
let end = Date()
print(end.timeIntervalSince(start))
// 29.841913998127
}
do {
let start = Date()
let count = compoundArray.reduce(0) { $0 + $1.count }
let end = Date()
print(end.timeIntervalSince(start))
// 0.000432014465332031
}
Ты можешь использовать joined
или же flatMap
для этого.
С помощьюjoined
let count = compoundArray.joined().count
С помощьюflatMap
let count = compoundArray.flatMap({$0}).count
Поскольку вы запрашиваете свойство, я решил указать, как его создать (для всех коллекций, пока мы на нем):
extension Collection where Iterator.Element: Collection {
var flatCount: Int {
self.reduce(0) { $0 + $1.count } // as per Martin R
}
}
Создание этой рекурсии кажется интересным упражнением.