gpt4 book ai didi

Swift:遍历数组元素并访问上一个和下一个元素

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:51 28 4
gpt4 key购买 nike

在 Swift 中,我想遍历一个数组并将每个元素与前一个和/或下一个元素进行比较。对于每次比较,我要么产生一个新元素,要么什么都不产生。是否有这样做的“功能性”方式?

一个例子可能是我有一个 Int 数组并且想要找到所有“局部最小值”。

我可以像这样按顺序做

let a = [ 1,2,2,3,5,4,2,5,7,9,5,3,8,10 ]
var i = 1
var r: [Int] = []

while i < a.count - 1 {
if a[i] < a[i+1] && a[i] < a[i-1] {
r.append(i)
}
i += 1
}

print(r)
// [6, 11]

我想知道是否有更简单或直接的方法来做到这一点。

最佳答案

一般可以使用dropFirst()zip()来遍历相邻的数组元素在平行下。这是一个简单的例子,它产生了增量数组数组元素:

let a = [ 1, 2, 2, 3, 5, 4, 2, 5, 7, 9, 5, 3, 8, 10 ]

let diffs = zip(a.dropFirst(), a).map(-)
print(diffs)
// [1, 0, 1, 2, -1, -2, 3, 2, 2, -4, -2, 5, 2]

要计算局部最小值的索引,我们可以迭代 aa.dropFirst()a.dropFirst(2) 并行。 enumerated() 用于跟踪数组偏移量,并使用 flatMap()(在 Swift 4.1 中重命名为 compactMap())只选择那些对应于局部最小值的索引:

let a = [ 1, 2, 2, 3, 5, 4, 2, 5, 7, 9, 5, 3, 8, 10 ]

let localMins = zip(a.enumerated().dropFirst(), zip(a, a.dropFirst(2))).flatMap {
$0.element < $1.0 && $0.element < $1.1 ? $0.offset : nil
}
print(localMins) // [6, 11]

关于Swift:遍历数组元素并访问上一个和下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com