Могу ли я переместить объекты в NSMutableArray без создания временного массива?
-
08-07-2019 - |
Вопрос
Я думал, что у меня все получилось с,
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];
}
}
который превращает 0,1,2,3,4 в 0,2,3,4,1, когда я сдвигаюсь на единицу.
Ожидаемый результат - 4,0,1,2,3
Я чувствую, что упускаю что-то очевидное...
Обновить: Спасибо, Матье, вот как теперь выглядит моя функция.
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
Я не знал, что вы можете создать универсальный NSObject и поместить в него какой-нибудь подкласс.Это все просто подсказки, так что, я думаю, все в порядке, не так ли?
Трудно избавиться от привычки думать об этих объектах как о Сумки из материала, а не указатели к сумке.
Решение
Попробуйте что-то вроде
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT - я не тестировал этот код, но это должно помочь вам решить проблему.
Другие советы
Вам нужно еще раз взглянуть на свой алгоритм.Каждый раз в цикле вы обмениваете один элемент на следующий (в случае shift=1).
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
Вы можете выполнить операцию, которую хотите выполнить, но вам нужно подумать о том, как упорядочить шаги и их зависимости, чтобы получить правильный результат.В тривиальном случае вы можете просто работать в обратном направлении с конца.
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