Pergunta

Eu pensei que tinha com ele,

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];
    }
}

que transforma 0,1,2,3,4 em 0,2,3,4,1 quando eu mudar por um.

O resultado esperado é 4,0,1,2,3

Eu sinto como se estivesse faltando alguma coisa óbvia ...

Update:. Graças Matthieu, isso é o que a minha função parece agora

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

Eu não sabia que você poderia fazer um NSObject genérico e colocar alguma subclasse nele. É todos os ponteiros apenas para que eu acho que é OK, certo?

É difícil quebrar o hábito de pensar desses objetos como sacos de coisas, em vez de ponteiros para o saco.

Foi útil?

Solução

Tente algo como

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

ressalva -. Eu não testei esse código, mas que deve ajudá-lo a resolver o problema

Outras dicas

Você precisa olhar novamente para o seu algoritmo. Cada vez através do loop, você troca de um item com (no caso de mudança = 1) a próxima.

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

Você pode fazer a operação que você quer fazer, mas você precisa pensar sobre como a ordem das etapas e suas dependências para obter o resultado certo. No caso trivial, você pode apenas trabalhar para trás a partir do final.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top