按范围遍历数组
Iterating over an array by range
我有一个数组:[1, 2, 3, 4, 5, 6...100]
我希望以 5 为单位迭代此数组,具体而言:
取数组的前 5 个数字并求平均值,继续接下来的 5 个数字并求平均值,依此类推..
我尝试了很多方法,例如 Dequeue
和 for 循环,但未能获得所需的结果。
试试这个:
extension Array {
// Use this extension method to get subArray [[1,2,3,4,5], [6,7,8,9,10],...]
func chunk(_ chunkSize: Int) -> [[Element]] {
return stride(from: 0, to: self.count, by: chunkSize).map({ (startIndex) -> [Element] in
let endIndex = (startIndex.advanced(by: chunkSize) > self.count) ? self.count-startIndex : chunkSize
return Array(self[startIndex..<startIndex.advanced(by: endIndex)])
})
}
}
let arr = Array(1...100)
var result: [Double] = []
for subArr in arr.chunk(5) {
result.append(subArr.reduce(0.0) {[=10=] + Double() / Double(subArr.count)}) // Use reduce to calculate avarage of numbers in subarray.
}
result // [3.0, 7.9999999999999991, 13.0, 18.0, 23.0, 28.000000000000004, 33.0, 38.0, 43.0, 48.0, 53.0, 58.0, 63.0, 68.0, 73.0, 78.0, 83.0, 88.0, 93.0, 98.0]
您需要使用递增循环迭代每 5 个元素并使用 reduce 对子序列求和,然后将总数除以子序列元素数:
let sequence = Array(1...100)
var results: [Double] = []
for idx in stride(from: sequence.indices.lowerBound, to: sequence.indices.upperBound, by: 5) {
let subsequence = sequence[idx..<min(idx.advanced(by: 5), sequence.count)]
let average = Double(subsequence.reduce(0, +)) / Double(subsequence.count)
results.append(average)
}
results // [3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78, 83, 88, 93, 98]
我有一个数组:[1, 2, 3, 4, 5, 6...100]
我希望以 5 为单位迭代此数组,具体而言:
取数组的前 5 个数字并求平均值,继续接下来的 5 个数字并求平均值,依此类推..
我尝试了很多方法,例如 Dequeue
和 for 循环,但未能获得所需的结果。
试试这个:
extension Array {
// Use this extension method to get subArray [[1,2,3,4,5], [6,7,8,9,10],...]
func chunk(_ chunkSize: Int) -> [[Element]] {
return stride(from: 0, to: self.count, by: chunkSize).map({ (startIndex) -> [Element] in
let endIndex = (startIndex.advanced(by: chunkSize) > self.count) ? self.count-startIndex : chunkSize
return Array(self[startIndex..<startIndex.advanced(by: endIndex)])
})
}
}
let arr = Array(1...100)
var result: [Double] = []
for subArr in arr.chunk(5) {
result.append(subArr.reduce(0.0) {[=10=] + Double() / Double(subArr.count)}) // Use reduce to calculate avarage of numbers in subarray.
}
result // [3.0, 7.9999999999999991, 13.0, 18.0, 23.0, 28.000000000000004, 33.0, 38.0, 43.0, 48.0, 53.0, 58.0, 63.0, 68.0, 73.0, 78.0, 83.0, 88.0, 93.0, 98.0]
您需要使用递增循环迭代每 5 个元素并使用 reduce 对子序列求和,然后将总数除以子序列元素数:
let sequence = Array(1...100)
var results: [Double] = []
for idx in stride(from: sequence.indices.lowerBound, to: sequence.indices.upperBound, by: 5) {
let subsequence = sequence[idx..<min(idx.advanced(by: 5), sequence.count)]
let average = Double(subsequence.reduce(0, +)) / Double(subsequence.count)
results.append(average)
}
results // [3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78, 83, 88, 93, 98]