在
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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。