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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top