给定一个数组: [1,3,6,8]
我该如何创建阵列[1,2,3,2]?(即[1, 3-1, 6-3, 8-6])
我写了一些愚蠢的复杂代码,只是崩溃了.我想使用map或reduce函数来使数组计算表达式非常好和简短.
救命 ?我知道这很简单,但我不知道该怎么做.
您可以通过自身的移位来"压缩"数组,并将结果映射到差异:
let numbers = [1,3,6,8]
let diffs = numbers.prefix(1) + zip(numbers, numbers.dropFirst()).map { $1 - $0 }
print(diffs) // [1, 2, 3, 2]
Run Code Online (Sandbox Code Playgroud)
说明:
numbers.prefix(1) 返回带有初始数组元素的序列.numbers.dropFirst()在这种情况下,它是所有元素的子序列,但是第一个元素3, 6, 8.zip(...)创建一系列对,在较短的输入序列耗尽时停止,在这种情况下(1, 3), (3, 6), (6, 8).map { $1 - $0 }在这种情况下,将这对序列映射到元素差异的数组2, 6, 3.当然,你可以map相当容易地使用它.您只需要在当前项目之前跟踪该项目.
像这样的东西应该做的伎俩:
// your array
let arr = [1, 3, 6, 8]
// a variable to keep track of the previous item
var previousItem = 0
let arrOfDifferences:[Int] = arr.map {item in // the current item
defer {previousItem = item} // set the previous item to the current one, after the return happens
return item-previousItem // return the difference
}
print(arrOfDifferences) // [1, 2, 3, 2]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |