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]
我有以下数组:
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]