我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
当前回答
试试这个:
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];
}
其他回答
这是一个很好的宏,可以为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);
Swift 3语法:
let reversedArray = array.reversed()
要更新这个,在Swift中它可以很容易地完成:
array.reverse()
有一个更简单的解决方案,如果你利用NSArray内置的reverseObjectEnumerator方法,以及NSEnumerator的allObjects方法:
NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];
allObjects被记录为返回一个数组,其中的对象还没有被nextObject遍历,顺序如下:
该数组按枚举顺序包含枚举器的所有剩余对象。
反向枚举数组的最有效方法:
使用enumerateObjectsWithOptions:NSEnumerationReverse usingBlock。使用@JohannesFahrenkrug上面的基准测试,这比[[array reverseObjectEnumerator] allObjects]快8倍;:
NSDate *methodStart = [NSDate date];
[anArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//
}];
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);