我有一个数组,我想删除一堆索引
var arr = [0,1,2,3,4,5,6]
var rmIndices = [1,4,5]
从arr中删除指数1,4,5的最佳方法是什么?
答案 0 :(得分:20)
请注意[2, 6, 0, 3]
在Swift 3中消失了,并且不会保持顺序相同,尽管它可能同时执行。使用接受的答案会导致[0, 2, 3, 6]
,这可能是意料之外的。给出let flatArr = arr.enumerate().flatMap { rmIndices.contains($0.0) ? nil : $0.1 }
预期结果的几种替代方法是:
let filterArr = arr.enumerate().filter({ !rmIndices.contains($0.0) }).map { $0.1 }
或
--upgrade
答案 1 :(得分:9)
不是要删除的索引列表,而是可以更容易地保留索引列表,您可以使用Set
类型执行此操作:
let rmIndices = [1,4,5]
let keepIndices = Set(arr.indices).subtract([1,4,5])
然后你可以使用PermutationGenerator
创建一个只有那些索引的新数组:
arr = Array(PermutationGenerator(elements: arr, indices: keepIndices))
答案 2 :(得分:6)
rmIndices.sort({ $1 < $0 })
for index in rmIndices
{
arr.removeAtIndex(index)
}
请注意,我已按降序对索引进行排序。这是因为每次删除 E 元素时, E 之外的元素索引减1。
答案 3 :(得分:1)
对于Swift 3
var arr = [0,1,2,3,4,5,6]
let rmIndices = [1,4,5]
arr = arr.filter{ !rmIndices.contains($0) }
print(arr)
如果您想快速生成输出,那么您可以使用
var arr = [0,1,2,3,4,5,6]
let rmIndices = [1,4,5]
arr = Array(Set(arr).subtracting(rmIndices))
print(array)
但它会改变数组的顺序
答案 4 :(得分:1)
使用索引数组删除元素:
字符串和索引数组
let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
let indexAnimals = [0, 3, 4]
let arrayRemainingAnimals = animals
.enumerated()
.filter { !indexAnimals.contains($0.offset) }
.map { $0.element }
print(arrayRemainingAnimals)
//result - ["dogs", "chimps", "cow"]
整数和索引数组
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let indexesToRemove = [3, 5, 8, 12]
numbers = numbers
.enumerated()
.filter { !indexesToRemove.contains($0.offset) }
.map { $0.element }
print(numbers)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
使用其他数组的元素值删除元素
整数数组
let arrayResult = numbers.filter { element in
return !indexesToRemove.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
字符串数组
let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
let arrayRemoveLetters = ["a", "e", "g", "h"]
let arrayRemainingLetters = arrayLetters.filter {
!arrayRemoveLetters.contains($0)
}
print(arrayRemainingLetters)
//result - ["b", "c", "d", "f", "i"]
答案 5 :(得分:0)
flatmap的问题在于,如果您的数组包含选项,它会给出错误的结果。
以下内容比提供的功能样式解决方案快得多,并且可以与选项一起使用。您只需确保rmIndices
已排序且唯一。它也是语言无关的。
var numRemoved: Int = 0
for index in rmIndices {
let indexToRemove = index - numRemoved
arr.remove(at: indexToRemove)
numRemoved += 1
}
如果您需要确保rmIndices
已排序且唯一:
rmIndices = Set(rmIndices).sorted()
使用XCTest删除500个元素(包括确保唯一性和排序的操作):
0.006秒
VS。
arr.enumerated().filter({ !rmIndices.contains($0.0) }).map { $0.1 }
:
0.206秒
我将它用作Array
的扩展名extension Array {
mutating func remove(at indices: [Int]) {
let rmIndices = Set(indices).sorted()
var numRemoved: Int = 0
for index in rmIndices {
let indexToRemove = index - numRemoved
self.remove(at: indexToRemove)
numRemoved += 1
}
}
}
答案 6 :(得分:0)
在Swift 4中:
let newArr = arr.enumerated().compactMap {
rmIndices.contains($0.0) ? nil : $0.1
}
enumerated()
生成(索引,值)对compactMap
连接非nil值$0.0
是索引(枚举对的第一个元素),因为$ 0.1 $是值compactMap
收集在rmIndices
答案 7 :(得分:0)
使用lodash https://lodash.com/
var arr = [0,1,2,3,4,5,6]
var rmIndices = [1,4,5]
_.pullAt(arr, rmIndices);