加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:40:42 所属栏目:百科 来源:网络整理
导读:在 Swift中,我想循环一个数组并将每个元素与前一个和/或下一个元素进行比较.对于每次比较,我将生成一个新元素或什么也不做.有这种“功能性”的方式吗? 一个例子可能是我有一个Int数组,想要找到所有“局部最小值. 我可以像这样做顺序 let a = [ 1,2,3,5,4,7,
在 Swift中,我想循环一个数组并将每个元素与前一个和/或下一个元素进行比较.对于每次比较,我将生成一个新元素或什么也不做.有这种“功能性”的方式吗?

一个例子可能是我有一个Int数组,想要找到所有“局部最小值.

我可以像这样做顺序

let a = [ 1,2,3,5,4,7,9,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,10 ]

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

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

let a = [ 1,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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读