3 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
為了得到陣列的反轉(zhuǎn)副本,看danielpunkass'溶液使用reverseObjectEnumerator
。
要反轉(zhuǎn)可變數(shù)組,可以在代碼中添加以下類別:
@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

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您利用內(nèi)置reverseObjectEnumerator
方法NSArray
和以下allObjects
方法,有一個(gè)更容易的解決方案NSEnumerator
:
NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];
allObjects
記錄為返回一個(gè)數(shù)組,其中包含尚未遍歷的對象nextObject
,按順序:
此數(shù)組以枚舉順序包含枚舉器的所有剩余對象。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
一些基準(zhǔn)
1. reverseObjectEnumerator allObjects
這是最快的方法:
NSArray *anArray = @[@"aa", @"ab", @"ac", @"ad", @"ae", @"af", @"ag", @"ah", @"ai", @"aj", @"ak", @"al", @"am", @"an", @"ao", @"ap", @"aq", @"ar", @"as", @"at", @"au", @"av", @"aw", @"ax", @"ay", @"az", @"ba", @"bb", @"bc", @"bd", @"bf", @"bg", @"bh", @"bi", @"bj", @"bk", @"bl", @"bm", @"bn", @"bo", @"bp", @"bq", @"br", @"bs", @"bt", @"bu", @"bv", @"bw", @"bx", @"by", @"bz", @"ca", @"cb", @"cc", @"cd", @"ce", @"cf", @"cg", @"ch", @"ci", @"cj", @"ck", @"cl", @"cm", @"cn", @"co", @"cp", @"cq", @"cr", @"cs", @"ct", @"cu", @"cv", @"cw", @"cx", @"cy", @"cz"];NSDate *methodStart = [NSDate date];NSArray *reversed = [[anArray reverseObjectEnumerator] allObjects];NSDate *methodFinish = [NSDate date];NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];NSLog(@"executionTime = %f", executionTime);
結(jié)果: executionTime = 0.000026
2.迭代reverseObjectEnumerator
這速度在1.5x到2.5x之間:
NSDate *methodStart = [NSDate date];NSMutableArray *array = [NSMutableArray arrayWithCapacity:[anArray count]];NSEnumerator *enumerator = [anArray reverseObjectEnumerator];for (id element in enumerator) { [array addObject:element];}NSDate *methodFinish = [NSDate date];NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];NSLog(@"executionTime = %f", executionTime);
結(jié)果: executionTime = 0.000071
3. sortedArrayUsingComparator
速度在30x到40x之間(這里沒有驚喜):
NSDate *methodStart = [NSDate date];NSArray *reversed = [anArray sortedArrayUsingComparator: ^(id obj1, id obj2) { return [anArray indexOfObject:obj1] < [anArray indexOfObject:obj2] ? NSOrderedDescending : NSOrderedAscending;}];NSDate *methodFinish = [NSDate date];NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];NSLog(@"executionTime = %f", executionTime);
結(jié)果: executionTime = 0.001100
[[anArray reverseObjectEnumerator] allObjects]
在速度和輕松方面,明顯的贏家也是如此。
- 3 回答
- 0 關(guān)注
- 1241 瀏覽
添加回答
舉報(bào)