的阵列匹配条件迅速2个计数元件

问题描述 投票:6回答:6

基本上,我找下面的C ++代码的迅猛相当于:

std::count_if(list.begin(), list.end(), [](int a){ return a % 2 == 0; }); // counts instances of even numbers in list

我的问题是不实际寻找偶数当然;简单地计算匹配标准的实例的一般情况。

我还没有看到一个内置的,但很想听到,我只是错过了。

swift swift2
6个回答
23
投票

像这样:

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

10
投票

到Aderstedt的版本替代

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

我的直觉说,我的路会更快,因为它不需要第二阵列的创建。但是,你需要来分析两种方法来确定。

编辑

继MartinR的有关功能的概括评论,在这里它是

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

3
投票

最紧凑的减少语句,将做到这一点:

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

减少有两个变量:0(变量$ 0),然后在每个数组元素的(VAR $ 1)如果该值被2整除没有余再添加一个到你的计数开始。

这也是有效的,因为它不产生与使用a.filter(){}的额外阵列。计数。


2
投票

你也可以做到这一点与减少()

let a = Array(1 ... 20)
let evenCount = a.reduce(0) { (accumulator, value) -> Int in
    guard value % 2 == 0 else { return accumulator }
    return accumulator + 1
}

几乎要与map()filter功能尽一切实际上可以用reduce虽然它并不总是最可读的完成。


2
投票

默认数组:

let array: [Int] = [10, 10, 2, 10, 1, 2, 3]

斯威夫特5 count(where:)

let countOfTen = array.count(where: { $0 == 10 }) // 3

迅速4或更小filter(_:)

let countOfTen = array.filter({ $0 == 10 }).count // 3

1
投票

您可以使用Collection.lazy有Aderstedt的答案,但与O(1)空间的简单性。

let array = [1, 2, 3]
let count = array.lazy.filter({ $0 % 2 == 0 }).count
© www.soinside.com 2019 - 2024. All rights reserved.