Remplacement de plusieurs contenu du tableau avec un seul objet?
-
09-09-2019 - |
Question
J'ai un NSMutableArray
avec le contenu que je veux remplacer par des objets NSNull
.
Voici ce que je fais:
NSMutableArray* nulls = [NSMutableArray array];
for (NSInteger i = 0; i < myIndexes.count; i++)
[nulls addObject:[NSNull null]];
[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls];
Comment puis-je faire plus efficacement? Est-il possible d'énumérer un NSIndexSet, donc je peux remplacer le contenu du tableau un par un?
Résolu
méthode suggérée se révèle être plus rapide 2x (moy 0.000565s vs 0.001210s):
if (myIndex.count > 0)
{
NSInteger index = [myIndex firstIndex];
for (NSInteger i = 0; i < myIndex.count; i++)
{
[stageMap replaceObjectAtIndex:index withObject:[NSNull null]];
index = [myIndex indexGreaterThanIndex:index];
}
}
La solution
Vous pouvez utiliser une boucle de for
. Commencez par le premier indice, utilisez indexGreaterThanIndex:
pour obtenir l'index suivant, et l'arrêt après avoir frappé le dernier indice.
Ne pas oublier de tenir compte d'un ensemble d'indices vide. Le premier et dernier indice sera NSNotFound
dans ce cas. La meilleure façon est de tester le nombre de l'ensemble d'indices; si elle est de zéro, ne boucle pas.
En outre, ce que Jason Coco a dit au sujet du profilage. Ne vous inquiétez pas trop sur l'efficacité jusqu'à ce que votre programme fonctionne, et ne vont pas optimiser les choses jusqu'à ce que vous avez exécuté Shark (ou instruments, si c'est votre truc) et a trouvé exactement ce qui est lent.
Autres conseils
Je sais que c'est une question très ancienne, mais je signale ici au cas où quelqu'un d'autre trouve cette question, vous pouvez utiliser:
[indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
NSLog(@"index: %d", idx);
[objectArray replaceObjectAtIndex:idx
withObject:newObject];
}];
Ce qui est beaucoup plus succinct.