给定一个数组:[1,3,6,8]
我如何创建数组[1,2,3,2]
? (即[1, 3-1, 6-3, 8-6]
)
我写了一些愚蠢的复杂代码,只是崩溃了。我想使用map
或reduce
函数来使数组计算表达式非常好而且简短。
帮助?我知道这很简单,但我不知道该怎么做。
答案 0 :(得分:6)
你可以" zip"具有自身移位的数组并映射结果 差异:
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
。答案 1 :(得分:5)
当然,您可以使用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]
答案 2 :(得分:2)
以下是使用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]