我有一个数字数组,我想检查Factory
中的数字是否等于dagger.android
中的数字,如果是,我想将计数器增加1。我只能但不能提出适当的逻辑
这是我到目前为止尝试过的
index 1
因此将0 index 2
与0 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)
}
}
的计数器进行比较会增加1,
然后将0 index 0
到0 index 1
的计数器加1,
然后0 index 1
到0 index 2
的计数器增加1
然后从0 index 2
跳到1 index 3
,
然后将0 index 3
到0 index 4
的计数器加1
答案 0 :(得分:1)
您遇到的特定问题是struct Persisted<T: Codable>: Codable {
let _id:Int = 0
let value:T
init(from decoder:Decoder) throws {
value = try decoder.singleValueContainer().decode(T.self)
}
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encode(value)
}
}
在c.firstIndex(of: index)
中找到index
的第一个索引。我认为您打算写c
,但即使那样也行不通。例如,如果您询问c.firstIndex(of: val)
,即使您在数组中间,它也会始终为您提供c.firstIndex(of 0)
,因为第一个0
元素始终位于索引{{1} },在您的测试用例中。
另一个问题是您的0
在循环作用域中,这意味着每次迭代都会获得自己的独立0
变量,并初始化为count
,该变量最多将递增为count
,然后重新初始化。
这是更实用的样式的理想案例。这要简单得多,但也很容易。
解决方案包括四个步骤:
使用0
模式,对于由1
组成的数组zip(a, a.dropFirst())
,它将产生成对的相邻元素对的数组,例如a
从那里开始,需要检查每个对,以查看它们的两个元素是否相同。如果是这样,我们将它们更改为[1, 2, 3, 4, 5]
,否则更改为[(1, 2), (2, 3), (3, 4), (4, 5)]
。
然后我们将这些数字求和即可得出最终结果。
理想情况下,我们将此代码打包到一个函数中,并使其具有通用性,以便可以轻松重用。
因此我们得到:
0
答案 1 :(得分:0)
尝试
let c: [Int] = [0, 0, 0, 0, 1, 0]
var counter = 0
var lastIndexOfZero = 0
for index in 1..<c.count {
if c[lastIndexOfZero] == c[index] {
counter += 1
}
if c[index] == 0 {
lastIndexOfZero = index
}
}
print(counter)
或者您可以简单地做
// in case your first number is 1
print(c.filter({ $0 == c[0] }).count-1)
答案 2 :(得分:0)
尝试一下:)。
let numbers = [0, 0, 0, 0, 1, 0]
let count = numbers.enumerated().reduce(0) { result, tuple in
let nextOffset = tuple.offset + 1
guard
nextOffset < numbers.count,
numbers[nextOffset] == tuple.element
else {
return result
}
return result + 1
}
print(count)
这将为您的数组返回3
。
答案 3 :(得分:0)
尝试一下:
let c: [Int] = [0, 0, 0, 0, 1, 0]
let numberOfCycles = c.count-2
var count = 0
for i in 0...numberOfCycles {
if c[i] == c[i+1] {
count += 1
}
}
print(count)