Считать элементы в массиве массивов?

Если у меня есть объект, который объявлен как

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
    }
}

Создание этой рекурсии кажется интересным упражнением.

Другие вопросы по тегам