2009-09-17 7 views
7

Je pensais que je l'avais avecPuis-je déplacer les objets dans un NSMutableArray sans créer de tableau temporaire?

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 se 0,1,2,3,4 en 0,2,3,4,1 quand je déplace un.

Le résultat attendu est 4,0,1,2,3

Je me sens comme si je manque quelque chose évidente ...

Mise à jour: Merci Matthieu, c'est ce que mon apparence de fonction comme maintenant. Je ne savais pas que vous pouviez créer un NSObject générique et y ajouter une sous-classe. Tout est juste des pointeurs donc je suppose que c'est OK, non?

Il est difficile de briser l'habitude de penser à ces objets comme des sacs de choses plutôt que pointeurs dans le sac.

+0

Quel est le résultat attendu lorsque vous changez d'une unité? 4,0,1,2,3? – mrueg

Répondre

13

Essayez quelque chose comme

for (NSUInteger i = shift; i > 0; i--) { 
    NSObject* obj = [mutableArray lastObject]; 
    [mutableArray insertObject:obj atIndex:0]; 
    [mutableArray removeLastObject]; 
} 

OPPOSITION - Je n'ai pas testé ce code, mais cela devrait vous aider à résoudre le problème.

3

Vous devez revoir votre algorithme. Chaque fois que vous passez la boucle, vous échangez un élément avec (dans le cas de shift = 1) le suivant.

0,1,2,3,4
, , 2,3,4
1, 2 , , 3,4
1,2, , , 4
1,2,3, 4 ,
, 2,3,4,

Vous pouvez faire l'opération que vous voulez faire, mais vous devez réfléchir à la façon de commander 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
, 1,2,3,
4,1,2, ,
4,1, , , 3
4, , , 2,3

+2

En outre, il convient de souligner que, même si vous pouvez le faire avec des swaps, vous ne pouvez pas le vouloir. Décoller le dernier élément et l'ajouter au début ou créer un nouveau tableau sont probablement moins chers. – masto

Questions connexes