基本上,我找下面的C ++代码的迅猛相当于:
std::count_if(list.begin(), list.end(), [](int a){ return a % 2 == 0; }); // counts instances of even numbers in list
我的问题是不实际寻找偶数当然;简单地计算匹配标准的实例的一般情况。
我还没有看到一个内置的,但很想听到,我只是错过了。
像这样:
let a: [Int] = ...
let count = a.filter({ $0 % 2 == 0 }).count
到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
最紧凑的减少语句,将做到这一点:
let a = Array(1 ... 20)
let evencount = a.reduce(0) { $0 + ($1 % 2 == 0 ? 1 : 0) }
减少有两个变量:0(变量$ 0),然后在每个数组元素的(VAR $ 1)如果该值被2整除没有余再添加一个到你的计数开始。
这也是有效的,因为它不产生与使用a.filter(){}的额外阵列。计数。
你也可以做到这一点与减少()
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
虽然它并不总是最可读的完成。
默认数组:
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
您可以使用Collection.lazy有Aderstedt的答案,但与O(1)空间的简单性。
let array = [1, 2, 3]
let count = array.lazy.filter({ $0 % 2 == 0 }).count