给定数组:[1,3,6,8]
如何创建数组[1,2,3,2]
?(即[1, 3-1, 6-3, 8-6]
)
我写了一些愚蠢的复杂代码,只是崩溃了。我希望使用map
或reduce
函数来使数组计算表达式非常简洁。
帮忙?我知道这很简单,但我只是不知道怎么做。
发布于 2016-04-14 21:16:22
当然,您可以很容易地使用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]
发布于 2016-04-14 21:34:38
您可以通过自身的移动“压缩”数组,并将结果映射到差异:
let numbers = [1,3,6,8]
let diffs = numbers.prefix(1) + zip(numbers, numbers.dropFirst()).map { $1 - $0 }
print(diffs) // [1, 2, 3, 2]
解释:
numbers.prefix(1)
返回带有初始数组元素的序列。numbers.dropFirst()
是除第一个元素之外的所有元素的子序列,在本例中是3, 6, 8
。zip(...)
创建一个对序列,当较短的输入序列耗尽时停止,在本例中为(1, 3), (3, 6), (6, 8)
。map { $1 - $0 }
将此对序列映射到元素间差异的数组中,在本例中为2, 6, 3
。发布于 2016-04-14 22:17:47
这里有一个使用reduce
的解决方案
[1,3,6,8].reduce(([], 0)) {
($0.0 + [$1 - $0.1], $1)
}.0 // [1,2,3,2]
编辑:下面是使用reduce
的另一种解决方案,它的性能可能会更好:
var differences = [Int]()
[1,3,6,8].reduce(0) {
differences.append($1 - $0)
return $1
}
// differences is now [1,2,3,2]
https://stackoverflow.com/questions/36634032
复制相似问题