Swift 整数数组 - 查找与前一个元素之差大于 10 的索引

Swift Array of Ints - Find Index where the Difference to the Previous Element is Greater than 10

我有以下数组:

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

我想创建一个新数组 - 其中与前一个元素之差大于 10 的元素设置为 0。

// [1,3,2,1,4,3,0,3,5,2,1,0]

目前,我正在创建一个具有差异的新数组,然后过滤该数组以找到大于 10 的数组,然后比较这些数组 - 我觉得这让一切都变得过于复杂。

let diffArray = zip(array.dropFirst(), array).map(-) 
let filteredArray = diffArray.filter {abs([=13=]) > 10}

谢谢!

这应该可以做到。不过没什么特别的。

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

func resetValues(withDifference difference: Int, in array: inout [Int]) {
    for index in array.indices.dropFirst() {
        if abs(array[index - 1] - array[index]) >= 10 {
            array[index] = 0
        }
    }
}

resetValues(withDifference: 10, in: &array)
print(array)

因此,第一个元素保持原样,下一个元素被映射。如果与索引为 -1 的初始数组的元素之差大于 10,则元素为 "replaced" 乘以 0

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

var temp = array
let mapped = [temp[0]] + temp.dropFirst().enumerated().map {
    let condition = abs(temp[[=10=].offset] - [=10=].element) > 10
    if condition { temp[[=10=].offset + 1] = 0 }
    return condition ? 0 : [=10=].element
}

print(mapped) // [1,3,2,1,4,3,0,3,5,2,1,0]

...如果你不想用替换元素计数,只需删除 temp array

的设置元素
let array = [1,3,2,1,4,3,99,3,5,2,1,45]

let mapped = [array[0]] + array.dropFirst().enumerated().map {
    let condition = abs(array[[=11=].offset] - [=11=].element) > 10
    return condition ? 0 : [=11=].element
}

print(mapped) // [1,3,2,1,4,3,0,0,5,2,1,0]

或者,例如,如果您只想更改当前数组,则可以将此方法添加到 Int

Array 的扩展中
var array = [1,3,2,1,4,3,99,3,5,2,1,45]

extension Array where Element == Int {

    mutating func replace(difference: Int) {
        guard count > 0 else { return }
        self = [self[0]] + self.dropFirst().enumerated().map {
            let condition = abs(self[[=12=].offset] - [=12=].element) > difference
            if condition { self[[=12=].offset + 1] = 0 }
            return condition ? 0 : [=12=].element
        }
    }

}

array.replace(difference: 10)
print(array) // [1,3,2,1,4,3,0,3,5,2,1,0]

您可以映射数组,同时跟踪前一个元素:

let a = [1,3,2,1,4,3,99,3,5,2,1,45]

var previous = a.first ?? 0
let b = a.map { elem -> Int in
    defer { previous = elem }
    return elem - previous > 10 ? 0 : elem
}

print(b)
// [1, 3, 2, 1, 4, 3, 0, 3, 5, 2, 1, 0]

算法很简单:从第二个开始循环遍历所有数字,并替换比先例大10的数字。现在,有了 Swift 的数组功能,这可以通过一个函数调用来完成:

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

let filteredNumbers = array.indices.map { i in i > 0 && array[i] - array[i-1] > 10 ? 0 : array[i] }

一个有点复杂的解决方案,但它避免了通过索引访问数组,因此可以应用于任何 sequence/collection:

let filteredNumbers = array.reduce(into: (0, [Int]())) { [=11=].1.append(-[=11=].0 > 10 ? 0 : ); [=11=].0 =  }.1

您的需求说明与示例之间似乎存在差异。

"an element, whose difference to the previous element is greater than 10, is set to 0" 应该导致:

[1, 3, 2, 1, 4, 3, 0, 0, 5, 2, 1, 0]

但您的示例结果是 [1,3,2,1,4,3,0,3,5,2,1,0] 这表明差异实际上与 "transformed" 值有关前一个元素的。

因此,对于规定的要求,您可以这样做:

let filteredArray = array.enumerated().map{ [=11=] > 0 && abs( - array[[=11=]-1]) > 10 ? 0 :  }

或者像这样:

let filteredArray = zip([array[0]]+array,array).map{ abs([=12=]-) > 10 ? 0 :  }

两者都产生:

[1, 3, 2, 1, 4, 3, 0, 0, 5, 2, 1, 0]

但是,为了匹配您的示例结果(与先前转换值的差异),您应该这样做:

let filteredArray = array.dropFirst().reduce([array[0]]){[=14=] + [abs(-[=14=].last!)>10 ? 0 : ]}

产生:

[1, 3, 2, 1, 4, 3, 0, 3, 5, 2, 1, 0]