Могу ли я переместить объекты в NSMutableArray без создания временного массива?

StackOverflow https://stackoverflow.com/questions/1438101

Вопрос

Я думал, что у меня все получилось с,

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top