快速比较数组中的索引

时间:2019-04-10 14:52:31

标签: swift

我有一个数字数组,我想检查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

4 个答案:

答案 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,然后重新初始化。

更清洁的解决方案

这是更实用的样式的理想案例。这要简单得多,但也很容易。

解决方案包括四个步骤:

  1. 使用0模式,对于由1组成的数组zip(a, a.dropFirst()),它将产生成对的相邻元素对的数组,例如a

  2. 从那里开始,需要检查每个对,以查看它们的两个元素是否相同。如果是这样,我们将它们更改为[1, 2, 3, 4, 5],否则更改为[(1, 2), (2, 3), (3, 4), (4, 5)]

  3. 然后我们将这些数字求和即可得出最终结果。

  4. 理想情况下,我们将此代码打包到一个函数中,并使其具有通用性,以便可以轻松重用。

因此我们得到:

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)