我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
当前回答
要获得数组的反向副本,请参阅danielpunkass使用reverseObjectEnumerator的解决方案。
为了反转一个可变数组,你可以在你的代码中添加以下类别:
@implementation NSMutableArray (Reverse)
- (void)reverse {
if ([self count] <= 1)
return;
NSUInteger i = 0;
NSUInteger j = [self count] - 1;
while (i < j) {
[self exchangeObjectAtIndex:i
withObjectAtIndex:j];
i++;
j--;
}
}
@end
其他回答
试试这个:
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];
}
如果你想做的只是反向迭代,试试这个:
// iterate backwards
nextIndex = (currentIndex == 0) ? [myArray count] - 1 : (currentIndex - 1) % [myArray count];
你可以做一次[myArrayCount],并将其保存到一个局部变量(我认为这很昂贵),但我也猜测编译器将对上面写的代码做同样的事情。
这是一个很好的宏,可以为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);
Georg Schölly的分类非常好。然而,对于NSMutableArray,当数组为空时,使用NSUIntegers作为索引会导致崩溃。正确的代码是:
@implementation NSMutableArray (Reverse)
- (void)reverse {
NSInteger i = 0;
NSInteger j = [self count] - 1;
while (i < j) {
[self exchangeObjectAtIndex:i
withObjectAtIndex:j];
i++;
j--;
}
}
@end
在看了上面其他人的答案并在这里找到马特·加拉格尔的讨论后
我建议:
NSMutableArray * reverseArray = [NSMutableArray arrayWithCapacity:[myArray count]];
for (id element in [myArray reverseObjectEnumerator]) {
[reverseArray addObject:element];
}
正如Matt所观察到的:
在上面的例子中,你可能想知道-[NSArray reverseObjectEnumerator]是否会在循环的每次迭代中运行-可能会降低代码的速度。<…>
此后不久,他这样回答:
<……当for循环开始时,"collection"表达式只计算一次。这是最好的情况,因为您可以安全地将昂贵的函数放在“collection”表达式中,而不会影响循环的每次迭代性能。