如何计算一系列差异?

D A*_*D A 1 swift

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

我该如何创建阵列[1,2,3,2]?(即[1, 3-1, 6-3, 8-6])

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

救命 ?我知道这很简单,但我不知道该怎么做.

Mar*_*n R 6

您可以通过自身的移位来"压缩"数组,并将结果映射到差异:

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.

  • 在这里,我以为我最初只是自己压缩,只是意识到我的浏览器无法更新线程,直到我发布了我的> 6分钟写回答:0)!使用`dropFirst`和隐式丢弃非匹配长度序列的尾随元素比使用我的(删除)答案中的疯狂显式切片更好! (2认同)

Ham*_*ish 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]
Run Code Online (Sandbox Code Playgroud)