Как я могу обратить NSArray в Objective-C? - PullRequest
341 голосов
/ 25 февраля 2009

Мне нужно поменять мой NSArray.

Как пример:

[1,2,3,4,5] должно стать: [5,4,3,2,1]

Каков наилучший способ достичь этого?

Ответы [ 18 ]

1 голос
/ 23 января 2015

Или Скала-путь:

-(NSArray *)reverse
{
    if ( self.count < 2 )
        return self;
    else
        return [[self.tail reverse] concat:[NSArray arrayWithObject:self.head]];
}

-(id)head
{
    return self.firstObject;
}

-(NSArray *)tail
{
    if ( self.count > 1 )
        return [self subarrayWithRange:NSMakeRange(1, self.count - 1)];
    else
        return @[];
}
1 голос
/ 14 октября 2013

Что касается меня, вы рассматривали, как массив был заполнен в первую очередь? Я находился в процессе добавления МНОГИХ объектов в массив и решил вставить каждый из них в начале, увеличивая все существующие объекты на один. В этом случае требуется изменяемый массив.

NSMutableArray *myMutableArray = [[NSMutableArray alloc] initWithCapacity:1];
[myMutableArray insertObject:aNewObject atIndex:0];
0 голосов
/ 30 мая 2017

Синтаксис Swift 3:

let reversedArray = array.reversed()
0 голосов
/ 17 декабря 2013

Если все, что вы хотите сделать, это выполнить итерацию в обратном порядке, попробуйте это:

// iterate backwards
nextIndex = (currentIndex == 0) ? [myArray count] - 1 : (currentIndex - 1) % [myArray count];

Вы можете сделать [myArrayCount] один раз и сохранить его в локальной переменной (я думаю, это дорого), но я также предполагаю, что компилятор будет делать то же самое с кодом, как написано выше.

0 голосов
/ 06 июня 2013

Попробуйте это:

for (int i = 0; i < [arr count]; i++)
{
    NSString *str1 = [arr objectAtIndex:[arr count]-1];
    [arr insertObject:str1 atIndex:i];
    [arr removeObjectAtIndex:[arr count]-1];
}
0 голосов
/ 09 декабря 2017

Есть простой способ сделать это.

    NSArray *myArray = @[@"5",@"4",@"3",@"2",@"1"];
    NSMutableArray *myNewArray = [[NSMutableArray alloc] init]; //this object is going to be your new array with inverse order.
    for(int i=0; i<[myNewArray count]; i++){
        [myNewArray insertObject:[myNewArray objectAtIndex:i] atIndex:0];
    }
    //other way to do it
    for(NSString *eachValue in myArray){
        [myNewArray insertObject:eachValue atIndex:0];
    }

    //in both cases your new array will look like this
    NSLog(@"myNewArray: %@", myNewArray);
    //[@"1",@"2",@"3",@"4",@"5"]

Надеюсь, это поможет.

0 голосов
/ 14 июля 2018

Вот хороший макрос, который будет работать для NSMutableArray ИЛИ NSArray:

#define reverseArray(__theArray) {\
    if ([__theArray isKindOfClass:[NSMutableArray class]]) {\
        if ([(NSMutableArray *)__theArray count] > 1) {\
            NSUInteger i = 0;\
            NSUInteger j = [(NSMutableArray *)__theArray count]-1;\
            while (i < j) {\
                [(NSMutableArray *)__theArray exchangeObjectAtIndex:i\
                                                withObjectAtIndex:j];\
                i++;\
                j--;\
            }\
        }\
    } else if ([__theArray isKindOfClass:[NSArray class]]) {\
        __theArray = [[NSArray alloc] initWithArray:[[(NSArray *)__theArray reverseObjectEnumerator] allObjects]];\
    }\
}

Для использования просто позвоните: reverseArray(myArray);

0 голосов
/ 25 февраля 2009

Я не знаю ни одного встроенного метода. Но ручное кодирование не так уж сложно. Предполагая, что элементы массива, с которым вы имеете дело, являются объектами NSNumber целочисленного типа, а 'arr' является NSMutableArray, который вы хотите сторнировать.

int n = [arr count];
for (int i=0; i<n/2; ++i) {
  id c  = [[arr objectAtIndex:i] retain];
  [arr replaceObjectAtIndex:i withObject:[arr objectAtIndex:n-i-1]];
  [arr replaceObjectAtIndex:n-i-1 withObject:c];
}

Поскольку вы начинаете с NSArray, вы должны сначала создать изменяемый массив с содержимым исходного NSArray ('origArray').

NSMutableArray * arr = [[NSMutableArray alloc] init];
[arr setArray:origArray];

Редактировать: Исправлено n -> n / 2 в счетчике циклов и изменен NSNumber на более общий идентификатор из-за предложений в ответе Брента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...