【发布时间】:2019-04-16 01:18:53
【问题描述】:
var a = [32,37,68,66,97,38,16,86,35,58]
我想知道, 如何打印偶数的和&平均,奇数的和&平均
【问题讨论】:
-
如果您向我们展示您已经尝试过的内容,我们可以帮助您解决问题或为您指明正确的方向。
标签: swift
var a = [32,37,68,66,97,38,16,86,35,58]
我想知道, 如何打印偶数的和&平均,奇数的和&平均
【问题讨论】:
标签: swift
你可以一口气完成:
let (oddsSum, oddsCount, evensSum, evensCount) = a.reduce(into:(0, 0, 0, 0)) { tuple, element in
if element % 2 != 0 {
tuple.0 += element
tuple.1 += 1
} else {
tuple.2 += element
tuple.3 += 1
}
}
let oddsAverage = oddsCount == 0 ? 0.0 : Double(oddsSum) / Double(oddsCount)
let evensAverage = evensCount == 0 ? 0.0 : Double(evensSum) / Double(evensCount)
这将产生以下结果:
oddsSum //169 平均赔率 //56.33333333333334 偶数总和 //364 evensAverage //52
您可以像这样创建两个奇偶数组:
let a = [32, 37, 68, 66, 97, 38, 16, 86, 35, 58]
let (odds, evens) = a.reduce(into:([Int](), [Int]())) { tuple, element in
if element % 2 != 0 {
tuple.0.append(element)
} else {
tuple.1.append(element)
}
}
odds 和 evens 是两个整数数组:[Int]。
计算总和:
let oddsSum = odds.reduce(0, +) //169
let evensSum = odds.reduce(0, +) //364
您也可以使用 Accelerate 框架中的 cblas_dasum(_:_:_:),它比 reduce 更快:
import Accelerate
var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
if element % 2 != 0 {
tuple.0.append(Double(element))
} else {
tuple.1.append(Double(element))
}
}
var oddSum = Int(cblas_dasum(Int32(odds.count), &odds, 1))
print(oddSum) //169
var evenSum = Int(cblas_dasum(Int32(evens.count), &evens, 1))
print(evenSum) //364
平均值是总和除以每个数组中的元素数。
let oddsAverage = odds.isEmpty ? 0.0 : Double(oddsSum) / Double(odds.count) //56.33333333333334
let evensAverage = evens.isEmpty ? 0.0 : Double(evensSum) / Double(evens.count) //52
或者您可以使用 Accelerate 框架中的vDSP_meanvD(_:_:_:_:),这比计算总和然后除以计数要快:
import Accelerate
var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
if element % 2 != 0 {
tuple.0.append(Double(element))
} else {
tuple.1.append(Double(element))
}
}
var oddAvg = 0.0
vDSP_meanvD(&odds, 1, &oddAvg, vDSP_Length(odds.count))
print(oddAvg) //56.333333333333336
var evenAvg = 0.0
vDSP_meanvD(&evens, 1, &evenAvg, vDSP_Length(evens.count))
print(evenAvg) //52.0
【讨论】:
添加这样的扩展
extension Sequence where Self.Element == Int {
var sum: Int {
return self.reduce(0, { $0 + $1 })
}
}
然后这样做:
var a = [38,97,25,66,90,31,16,86,33,59]
var evens = a.filter({ ($0 % 2) == 0 })
var odds = a.filter({ ($0 % 2) != 0 })
print(evens.sum)
print(odds.sum)
【讨论】:
如果没有扩展,那么初学者可能更容易理解,我会这样做:
let oddElements = a.filter{$0 % 2 == 0}
let evenElements = a.filter{$0 % 2 != 0}
let oddElementsSum = oddElements.reduce(0, {$0 + $1})
let oddElementsAverage = oddElementsSum / oddElements.count
let evenElementsSum = evenElements.reduce(0, {$0 + $1})
let evenElementsAverage = evenElementsSum / evenElements.count
有可能使reduce语句更短一些
let oddElementsSum = oddElements.reduce(0, {+})
let evenElementsSum = evenElements.reduce(0, {+})
然后就可以通过打印了
print (oddElementsSum)
print (oddElementsAverage)
print (evenElementsSum)
print (evenElementsAverage)
【讨论】: