2012-12-12 195 views
4

我知道我們可以只使用一個NSMutableArray爲對象,但如果這不是一種選擇什麼,我們需要新的元素添加到NSArray。我們將如何去做這件事?將元素添加到一個的NSArray

我直接的答案是創建與原NSArray一個NSMutableArray,添加新的元素,然後投了NSMutableArray回原來的NSArray

有人問我這個在接受採訪時,並很好奇什麼是正確的解決方案可能是,除了在第一時間只使用一個NSMutableArray

回答

12
NSArray *array = [NSArray arrayWithObjects:@"One", @"Two", nil]; 

array = [array arrayByAddingObject:@"Three"]; 

NSArray *newArray = [NSArray arrayWithObjects:@"Three", @"Four", nil]; 

array = [array arrayByAddingObjectsFromArray:newArray]; 
+0

讓我們假設我有一個非常大**的數組。做OP要求的最有效方式是什麼?您的解決方案或OP提出的mutableCopy-> add-> cast解決方案? – Rob

+0

效率最高。可變數組。然後通過在我的方法中添加數組。我不知道。測試它,並讓我知道你的發現:-) – Fogmeister

+0

我測試了這一點,他們證明是相同的,只要你只增加一個元素,無論大小。這是長的解釋:http://stackoverflow.com/a/26517217/1564332 – Rob

3

您可以在NSArray對象上使用mutableCopy返回包含以前對象的NSMutableArray

3

NSArray對象是不可變的所以它們不能被修改。唯一的選擇是創建一個新NSArray(經由中間NSMutableArray對象也許),並把這個新的數組返回到所屬對象(如果它允許)。

0

這僅僅是一個有趣的問題。 NSArrays是不可變的,在不脫離以前陣列,簡單明瞭創建新NSArrayNSMutableArray不能被改變。

0

我想知道使用arrayByAddingObject和創建可變副本,然後添加一個元素之間的性能差異。

我發現,它並不重要。

下面是我用

- (IBAction)doTest 
{ 
    for(int n = 0; n < 7; n++){ 
     [self runTestWithExponent:n]; 
    } 
    NSLog(@"done"); 
} 

- (void)runTestWithExponent:(double)exponent 
{ 
    int arraySize = pow(10.0, exponent); 

    NSMutableArray *originalMutableArray = [NSMutableArray arrayWithCapacity:arraySize]; 
    for(int i = 0; i < arraySize; i++){ 
     [originalMutableArray addObject:@(i)]; 
    } 
    NSArray *originalArray = [NSArray arrayWithArray:originalMutableArray]; 
    originalMutableArray = nil; 

    //test first time 
    NSDate *now = [NSDate date]; 
    NSArray *newArray = [originalArray arrayByAddingObject:@(-1)]; 
    NSTimeInterval time1 = [[NSDate date] timeIntervalSinceDate:now]; 
    newArray = nil; 

    //test second time 
    now = [NSDate date]; 
    NSMutableArray *mutable = [originalArray mutableCopy]; 
    [mutable addObject:@(-1)]; 
    NSTimeInterval time2 = [[NSDate date] timeIntervalSinceDate:now]; 
    mutable = nil; 

    NSString *winner = (time1 == time2) ? @"same" : ((time1 < time2) ? @"arrayByAdding" : @"mutable"); 
    NSLog(@"%i : %f --- %f : %@ %f%%", arraySize, time1, time2, winner, (time1/time2 * 100)); 
} 

正如你所看到的,我測試不同的數組大小。尺寸爲1,10,100 ... 1,000,000。我發現無論大小,時間都非常相似。對於任何給定的長度,有時一種方法更快,另一種方法更快。我在內部猜測他們做同樣的事情。

這裏有三個運行的輸出:

1 : 0.000026 --- 0.000034 : arrayByAdding 76.491228% 
10 : 0.000011 --- 0.000011 : same 100.000000% 
100 : 0.000021 --- 0.000024 : arrayByAdding 87.344913% 
1000 : 0.000228 --- 0.000260 : arrayByAdding 87.689133% 
10000 : 0.001458 --- 0.001406 : mutable 103.696638% 
100000 : 0.015396 --- 0.015625 : arrayByAdding 98.534393% 
1000000 : 0.158018 --- 0.162849 : arrayByAdding 97.033438% 
done 
1 : 0.000011 --- 0.000012 : arrayByAdding 92.039801% 
10 : 0.000012 --- 0.000014 : arrayByAdding 85.531915% 
100 : 0.000020 --- 0.000025 : arrayByAdding 79.952267% 
1000 : 0.000185 --- 0.000144 : mutable 128.435430% 
10000 : 0.001397 --- 0.001437 : arrayByAdding 97.216807% 
100000 : 0.014448 --- 0.014132 : mutable 102.235803% 
1000000 : 0.145622 --- 0.149862 : arrayByAdding 97.170746% 
done 
1 : 0.000013 --- 0.000012 : mutable 107.920792% 
10 : 0.000011 --- 0.000013 : arrayByAdding 84.862385% 
100 : 0.000025 --- 0.000029 : arrayByAdding 86.036961% 
1000 : 0.000165 --- 0.000135 : mutable 122.207506% 
10000 : 0.001547 --- 0.001470 : mutable 105.242884% 
100000 : 0.014817 --- 0.014337 : mutable 103.347954% 
1000000 : 0.146554 --- 0.148468 : arrayByAdding 98.710857% 
done 

請記住,這只是測試將一個元素。我懷疑(例如)使用第二種方法爲1000個陣列添加500個元素可能會更快,但我將這些實驗留給其他人。