如何计算一系列差异?

时间:2016-04-14 21:08:11

标签: swift

给定一个数组:[1,3,6,8]

我如何创建数组[1,2,3,2]? (即[1, 3-1, 6-3, 8-6]

我写了一些愚蠢的复杂代码,只是崩溃了。我想使用mapreduce函数来使数组计算表达式非常好而且简短。

帮助?我知道这很简单,但我不知道该怎么做。

3 个答案:

答案 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]