Могу ли я сдвинуть объекты в NSMutableArray без создания временного массива? - PullRequest
7 голосов
/ 17 сентября 2009

Я думал, что у меня это было,

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 и поместить в него некоторый подкласс. Это всего лишь указатели, поэтому я думаю, что все в порядке, верно?

Трудно отказаться от привычки думать об этих объектах как о сумках вещей, а не указателях на сумку.

Ответы [ 2 ]

13 голосов
/ 17 сентября 2009

Попробуйте что-то вроде

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

CAVEAT - я не тестировал этот код, но это должно помочь вам решить проблему.

3 голосов
/ 17 сентября 2009

Вам нужно еще раз взглянуть на свой алгоритм. Каждый раз в цикле вы обмениваете один элемент с (в случае смещения = 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 * тысяча сорок-четыре * 1 045 *, 2 * * одна тысяча сорок семь, 3
4, * 1 049 * 0
, * 1 * тысяча пятьдесят-одна * * тысяча пятьдесят два, 2,3
* 1 054 *

...