Est-il possible de supprimer plus d'un élément d'un tableau, en même temps, en utilisant les emplacements d'index selon .remove (at: i), un peu comme:
Pseudo code:
myArray.remove(at: 3, 5, 8, 12)
Et si oui, quelle est la syntaxe pour faire cela?
METTRE À JOUR:
J'essayais cela, cela fonctionnait, mais l'extension de la réponse ci-dessous est beaucoup plus lisible et raisonnable, et permet d'atteindre l'objectif de celui qui est exactement le pseudo-code.
un tableau de "positions" est créé: [3, 5, 8, 12]
let sorted = positions.sorted(by: { $1 < $0 })
for index in sorted
{
myArray.remove(at: index)
}
C'est possible si les index sont continus en utilisant la méthode removeSubrange
. Par exemple, si vous souhaitez supprimer des éléments d'index 3 à 5:
myArray.removeSubrange(ClosedRange(uncheckedBounds: (lower: 3, upper: 5)))
Pour les index non continus, je vous recommande de supprimer les éléments avec un index plus grand à un plus petit. Je ne pouvais penser à aucun avantage à supprimer des éléments "en même temps" dans une seule ligne, sauf que le code pourrait être plus court. Vous pouvez le faire avec une méthode d'extension:
extension Array {
mutating func remove(at indexes: [Int]) {
for index in indexes.sorted(by: >) {
remove(at: index)
}
}
}
Ensuite:
myArray.remove(at: [3, 5, 8, 12])
UPDATE: en utilisant la solution ci-dessus, vous devez vous assurer que le tableau d'index ne contient pas d'index dupliqués. Ou vous pouvez éviter les doublons comme ci-dessous:
extension Array {
mutating func remove(at indexes: [Int]) {
var lastIndex: Int? = nil
for index in indexes.sorted(by: >) {
guard lastIndex != index else {
continue
}
remove(at: index)
lastIndex = index
}
}
}
var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
myArray.remove(at: [5, 3, 5, 12]) // duplicated index 5
// result: [0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 13] only 3 elements are removed
Supprimer des éléments à l'aide des index d'un tableau d'éléments:
Tableau de chaînes et d'index
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"]
Tableau d'entiers et d'index
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]
Supprimer des éléments en utilisant la valeur d'un autre tableau
Tableaux d'entiers
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let elementsTobeRemoved = [3, 5, 8, 12]
let arrayResult = numbers.filter { element in
return !elementsTobeRemoved.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Tableaux de cordes
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"]
Swift 4
extension Array {
mutating func remove(at indexs: [Int]) {
guard !isEmpty else { return }
let newIndexs = Set(indexs).sorted(by: >)
newIndexs.forEach {
guard $0 < count, $0 >= 0 else { return }
remove(at: $0)
}
}
}
var arr = ["a", "b", "c", "d", "e", "f"]
arr.remove(at: [2, 3, 1, 4])
result: ["a", "f"]
Solution simple et claire, juste l'extension Array
:
extension Array {
mutating func remove(at indices: [Int]) {
Set(indices)
.sorted(by: >)
.forEach { rmIndex in
self.remove(at: rmIndex)
}
}
}
Set(indices)
- garantit l'unicité .sorted(by: >)
- function supprime les éléments du dernier au premier, nous sommes donc sûrs que les index sont correctsSelon l'API NSMutableArray
, il est recommandé d'implémenter les index sous la forme IndexSet
.
Vous avez juste besoin d'inverser l'ordre.
extension Array {
mutating func remove(at indexes: IndexSet) {
indexes.reversed().forEach{ self.remove(at: $0) }
}
}
Voir aussi cette réponse fournissant un algorithme plus efficace.
Vous pouvez créer un ensemble d’index que vous souhaitez supprimer.
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let indexSet = [3, 5, 8, 12]
indexSet.reversed().forEach{ array.remove(at: $0) }
print(array)
Sortie: [0, 1, 2, 4, 6, 7, 9, 10, 11]
Si les index sont continus, utilisez removeSubrange
array.removeSubrange(1...3) /// Will remove the elements from 1, 2 and 3 positions.