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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top