Puis-je déplacer les objets d'un NSMutableArray sans créer de tableau temporaire?
-
08-07-2019 - |
Question
Je pensais l'avoir avec,
void shiftArray(NSMutableArray *mutableArray, NSUInteger shift)
{
for (NSUInteger i = 0; i < [mutableArray count]; i++) {
NSUInteger newIndex = (i + shift) % [mutableArray count];
[mutableArray exchangeObjectAtIndex:i withObjectAtIndex:newIndex];
}
}
qui transforme 0,1,2,3,4 en 0,2,3,4,1 lorsque je décale d'une unité.
Le résultat attendu est 4,0,1,2,3
J'ai l'impression qu'il me manque quelque chose d'évident ...
Mise à jour: Merci Matthieu, voici à quoi ressemble ma fonction.
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
Je ne savais pas que vous pouviez créer un objet NSObject générique et y placer une sous-classe. C'est juste des pointeurs alors je suppose que c'est OK, non?
Il est difficile de rompre avec l'habitude de considérer ces objets comme des sacs d'objets plutôt que des indicateurs du sac.
La solution
Essayez quelque chose comme
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT - Je n'ai pas testé ce code, mais cela devrait vous aider à résoudre le problème.
Autres conseils
Vous devez revoir votre algorithme. Chaque fois que vous passez dans la boucle, vous échangez un élément avec (dans le cas d'un décalage = 1) le suivant.
0,1,2,3,4
1 , 0 , 2,3,4
1, 2 , 0 , 3,4
1,2, 3 , 0 , 4
1, 2, 3, 4 , 0
0 , 2,3,4, 1
Vous pouvez effectuer l'opération que vous souhaitez effectuer, mais vous devez réfléchir à la manière de classer les étapes et leurs dépendances pour obtenir le bon résultat. Dans le cas trivial, vous pouvez simplement travailler en arrière à partir de la fin.
0,1,2,3,4
4 , 1,2,3, 0
4,1,2, 0 , 3
4,1, 0 , 2 , 3
4, 0 , 1 , 2,3