首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算一系列差异?

如何计算一系列差异?
EN

Stack Overflow用户
提问于 2016-04-14 21:08:11
回答 3查看 288关注 0票数 1

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

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

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

帮忙?我知道这很简单,但我只是不知道怎么做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-14 21:16:22

当然,您可以很容易地使用map来完成这一任务。您只需在当前项目之前跟踪该项目。

像这样的事情应该能起作用:

代码语言:javascript
运行
复制
// 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]
票数 5
EN

Stack Overflow用户

发布于 2016-04-14 21:34:38

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

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 2016-04-14 22:17:47

这里有一个使用reduce的解决方案

代码语言:javascript
运行
复制
[1,3,6,8].reduce(([], 0)) {
    ($0.0 + [$1 - $0.1], $1)
}.0 // [1,2,3,2]

编辑:下面是使用reduce的另一种解决方案,它的性能可能会更好:

代码语言:javascript
运行
复制
var differences = [Int]()
[1,3,6,8].reduce(0) {
    differences.append($1 - $0)
    return $1
}
// differences is now [1,2,3,2]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36634032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档