Posso spostare gli oggetti in un NSMutableArray senza creare un array temporaneo?
-
08-07-2019 - |
Domanda
Pensavo di averlo avuto,
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];
}
}
che trasforma 0,1,2,3,4 in 0,2,3,4,1 quando cambio di uno.
Il risultato atteso è 4,0,1,2,3
Sento che mi manca qualcosa di ovvio ...
Aggiornamento: Grazie Matthieu, ecco come appare la mia funzione ora.
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
Non sapevo che potessi creare un oggetto NSO generico e inserirvi una sottoclasse. Sono solo dei puntatori, quindi credo che sia OK, giusto?
È difficile rompere l'abitudine di pensare a questi oggetti come borse di cose piuttosto che puntatori sulla borsa.
Soluzione
Prova qualcosa del genere
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT - Non ho testato quel codice, ma ciò dovrebbe aiutarti a risolvere il problema.
Altri suggerimenti
Devi rivedere il tuo algoritmo. Ogni volta che si esegue il ciclo, si scambia un oggetto con (nel caso di shift = 1) il successivo.
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
Puoi fare l'operazione che vuoi fare, ma devi pensare a come ordinare i passaggi e le loro dipendenze per ottenere il risultato giusto. Nel caso banale, puoi semplicemente lavorare all'indietro dalla fine.
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