Swift 2 Count elements of array matching condition

Like this:

 let a: [Int] = ...
 let count = a.filter({ $0 % 2 == 0 }).count

An alternative to Aderstedt's version

let a = [ .... ]
let count = a.reduce(0){ 
    (count, element) in 
    return count + 1 - element % 2
}

My intuition says my way will be faster because it doesn't require the creation of a second array. However, you'd need to profile both methods to be sure.

Edit

Following MartinR's comment about generalisation of the function, here it is

extension SequenceType
{
    func countMatchingCondition(condition: (Self.Generator.Element) -> Bool) -> Int
    {
        return self.reduce(0, combine: { (count, e) in count + (condition(e) ? 1 : 0) })
    }
}

let a = [1, 2, 3, 3, 4, 12].countMatchingCondition { $0 % 2 == 0 }
print("\(a)") // Prints 3

The most compact reduce statement that will do this is:

let a = Array(1 ... 20)
let evencount = a.reduce(0) { $0 + ($1 % 2 == 0 ? 1 : 0) }

Reduce takes two variables: starts with 0 (var $0) then for every element in Array a (var $1) if the value is divisible by 2 with no remainder then add one to your count.

This is also efficient as it does not create an additional array unlike using a.filter(){}.count .

Tags:

Swift

Swift2