我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
我需要反转NSArray。
举个例子:
[1,2,3,4,5]必须变成:[5,4,3,2,1]
实现这一目标的最佳方式是什么?
当前回答
至于我,你考虑过数组是如何被填充的吗?我正在向一个数组中添加许多对象,并决定在开始时插入每个对象,将任何现有对象向上推一个。在这种情况下,需要一个可变数组。
NSMutableArray *myMutableArray = [[NSMutableArray alloc] initWithCapacity:1];
[myMutableArray insertObject:aNewObject atIndex:0];
其他回答
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”表达式中,而不会影响循环的每次迭代性能。
有一个更简单的解决方案,如果你利用NSArray内置的reverseObjectEnumerator方法,以及NSEnumerator的allObjects方法:
NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];
allObjects被记录为返回一个数组,其中的对象还没有被nextObject遍历,顺序如下:
该数组按枚举顺序包含枚举器的所有剩余对象。
或者scala方式:
-(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 @[];
}
NSMutableArray *objMyObject = [NSMutableArray arrayWithArray:[self reverseArray:objArrayToBeReversed]];
// Function reverseArray
-(NSArray *) reverseArray : (NSArray *) myArray {
return [[myArray reverseObjectEnumerator] allObjects];
}