Jonathan Tuzman
Jonathan Tuzman

Reputation: 13262

Count Items in an Array of Arrays?

If I have an object that is declared as

let compoundArray = [Array<String>]

is there a property that would give me the number of strings in all the arrays contained in compoundArray?

I can do it by adding up all the items in each array within:

var totalCount = 0
for array in compoundArray {
   totalCount += array.count }
//totalCount = total items in all arrays within compoundArray

But that seems clunky and it seems that swift would have a property/method of Array to do this, no?

Thanks!

Upvotes: 10

Views: 13134

Answers (3)

Raphael
Raphael

Reputation: 10549

Since you are asking for a property, I thought I'd point out how to create one (for all collections, while we're at it):

extension Collection where Iterator.Element: Collection {
    var flatCount: Int {
        return self.reduce(0) { $0 + $1.count } // as per Martin R
    }
}

Making this recursive seems to be an interesting exercise.

Upvotes: 3

Martin R
Martin R

Reputation: 539685

You can add the nested array counts with

let count = compoundArray.reduce(0) { $0 + $1.count }

Performance comparison for large arrays (compiled and run on a MacBook Pro in Release configuration):

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
}

Upvotes: 20

Nirav D
Nirav D

Reputation: 72410

You can use joined or flatMap for that.

Using joined

let count = compoundArray.joined().count

Using flatMap

let count = compoundArray.flatMap({$0}).count

Upvotes: 12

Related Questions