Posso mudar os objetos em um NSMutableArray sem criar uma matriz temporária?
-
08-07-2019 - |
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.
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