swift - 快速比较数组中的索引
问题描述
我有一个数字数组,我想检查其中的数字index 1
是否等于数字index 2
,如果是,我想将我的计数器增加 1。我已尽我所能,但无法提出正确的逻辑
这是我迄今为止尝试过的
let c: [Int] = [0, 0, 0, 0, 1, 0]
for (index, val) in c.enumerated() {
print(val)
var counts = 0
if c.firstIndex(of: index) == c.index(after: index) {
print("yes")
counts += 1
print(counts)
}
}
所以比较 0index 0
到 0index 1
计数器加 1,
然后 0index 1
到 0index 2
计数器加 1,
然后 0index 2
到 0index 3
计数器加 1 ,
然后 0index 3
到 1index 4
跳过,
然后 0index 3
到 0index 5
计数器加 1
解决方案
手头的问题
在您的情况下,特定问题是找到inc.firstIndex(of: index)
的第一个索引。我想你打算写 ,但即使这样也行不通。例如,如果你问,它总是会给你,即使你在数组的中间,因为在你的测试用例中,第一个元素总是在 index 。index
c
c.firstIndex(of: val)
c.firstIndex(of 0)
0
0
0
另一个问题是你count
在循环范围内,这意味着每次迭代都有自己的独立count
变量,初始化为,在重新初始化之前0
,它最多会递增到1
。
更清洁的解决方案
这是更实用的风格的理想案例。它更简单,但也很元素。
解决方案是一连串的 4 个步骤:
使用该
zip(a, a.dropFirst())
模式,对于a
由 组成的数组[1, 2, 3, 4, 5]
,它将产生一个由成对的相邻元素组成的数组,例如[(1, 2), (2, 3), (3, 4), (4, 5)]
从那里开始,检查每一对以查看它们的两个元素是否相同。如果是,我们将它们更改为 a
0
,否则为 a1
。然后我们只需将这些数字相加即可获得最终结果。
理想情况下,我们将此代码打包成一个函数,并使其具有通用性,以便轻松重用。
因此我们得到:
extension Sequence where Element: Equatable {
func countOfAjacentDifferingElements() -> Int {
return zip(self, self.dropFirst())
.lazy
.map { $0 == $1 ? 1 : 0 }
.reduce(0, +)
}
}
let numbers = [0, 0, 0, 0, 1, 0]
print(numbers.countOfAjacentDifferingElements()) // => 2
推荐阅读
- c - Isdigit() 不适用于 C 中 48-58 范围内的值
- c - asprint 内存泄漏需要帮助了解泄漏的来源和可能的修复
- python - PYTHON > 在 .csv 文件中重新排列项目数据(“日期”)
- python - 文本换行仅适用于 matplotlib 中的垂直标签
- latex - Markdown + LaTeX + Jekyll(Github 页面)= HTML?
- angular - 1 退订时发生错误
- html - 为什么 Sass 不能正确编译我的类?
- python - Python TypeError:“函数”对象不可下标
- javascript - 由 javascript 生成的元素激活时,Javascript 不起作用
- arrays - 修改后的 Kaprekar 数字 | 黑客等级