Pour plus de clarté, j'aime faire une boucle initiale où je rassemble les éléments à supprimer. Ensuite, je les supprime. Voici un exemple utilisant la syntaxe Objective-C 2.0 :
NSMutableArray *discardedItems = [NSMutableArray array];
for (SomeObjectClass *item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
Ensuite, il n'y a aucune question sur le bon fonctionnement de la mise à jour des indices, ou sur d'autres petits détails de gestion.
Édité pour ajouter :
Il a été noté dans d'autres réponses que la formulation inverse pourrait être plus rapide. Par exemple, si vous parcourez le tableau et composez un nouveau tableau d'objets à garder, au lieu d'objets à supprimer. Cela peut être vrai (mais qu'en est-il du coût en mémoire et en traitement de l'allocation d'un nouveau tableau, et de la suppression de l'ancien ?), mais même si c'est plus rapide, ce n'est peut-être pas aussi important que pour une implémentation naïve, car les NSArrays ne se comportent pas comme des tableaux "normaux". Ils parlent le langage mais marchent différemment. Voir une bonne analyse ici :
La formulation inverse peut être plus rapide, mais je n'ai jamais eu besoin de me soucier de savoir si c'était le cas, car la formulation ci-dessus a toujours été suffisamment rapide pour mes besoins.
Pour moi, le message à retenir est d'utiliser la formulation la plus claire pour vous. Optimisez seulement si nécessaire. Personnellement, je trouve la formulation ci-dessus la plus claire, c'est pourquoi je l'utilise. Mais si la formulation inverse est plus claire pour vous, allez-y.
9 votes
Bouclez de l'arrière vers l'avant.
0 votes
Personne ne répond à la question "POURQUOI"
1 votes
@HotLicks Un de mes préférés de tous les temps et la solution la plus sous-estimée en programmation en général :D