¿Puedo cambiar los objetos en un NSMutableArray sin crear una matriz temporal?
-
08-07-2019 - |
Pregunta
Pensé que lo tenía,
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 convierte 0,1,2,3,4 en 0,2,3,4,1 cuando cambio por uno.
El resultado esperado es 4,0,1,2,3
Siento que me falta algo obvio ...
Actualización: Gracias Matthieu, así es como se ve mi función ahora.
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
No sabía que podía hacer un NSObject genérico y ponerle una subclase. Todo son solo punteros, así que supongo que está bien, ¿verdad?
Es difícil romper el hábito de pensar en estos objetos como bolsas en lugar de punteros a la bolsa.
Solución
Pruebe algo como
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT - No he probado ese código, pero eso debería ayudarlo a resolver el problema.
Otros consejos
Necesitas mirar nuevamente tu algoritmo. Cada vez que realiza el ciclo, intercambia un elemento con (en el caso de shift = 1) el siguiente.
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
Puede realizar la operación que desea, pero debe pensar en cómo ordenar los pasos y sus dependencias para obtener el resultado correcto. En el caso trivial, puedes trabajar hacia atrás desde el 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