2009-11-20 104 views
13

我有一個NSArray,我想把它分成兩個相等的部分(如果奇數「計數」,然後添加到後者的新陣列) - 我想分裂它「中間」可以這麼說。如何將一個NSArray分成兩個相等的部分?

下面的代碼不正是我想要的,但有沒有更好的辦法?:

// NOTE: `NSArray testableArray` is an NSArray of objects from a class defined elsewhere; 
NSMutableArray *leftArray = [[NSMutableArray alloc] init]; 
NSMutableArray *rightArray = [[NSMutableArray alloc] init]; 

for (int i=0; i < [testableArray count]; i=i+1) { 
if (i < [testableArray count]/2) { 
     [leftArray addObject:[testableArray objectAtIndex:i]]; 
    } 
    else { 
     [rightArray addObject:[testableArray objectAtIndex:i]]; 
    } 
} 

一旦leftArray和rightArray製成,我不會改變他們,所以他們並不需要「可變」。我認爲有可能是完成與ObjectsAtIndexes方法或一些快速列舉方法上面的代碼的方式?,但我不能讓下面的代碼工作(或其他變化):

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]]; 
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]]; 

有誰知道,如果我我正朝着正確的方向走,還是指向正確的方向?

謝謝!

回答

40

您還可以使用-subarrayWithRange:NSArray文檔中詳細介紹的選項:

NSArray *firstHalfOfArray; 
NSArray *secondHalfOfArray; 
NSRange someRange; 

someRange.location = 0; 
someRange.length = [wholeArray count]/2; 

firstHalfOfArray = [wholeArray subarrayWithRange:someRange]; 

someRange.location = someRange.length; 
someRange.length = [wholeArray count] - someRange.length; 

secondHalfOfArray = [wholeArray subarrayWithRange:someRange]; 

這個方法返回一個新的,autorelease -d陣列。

+0

亞歷克斯,感謝您的超快反應(S)! 你的第二個解決方案要好得多。我覺得我太執着於實施NSRange,你在上面的例子中也非常清楚地闡明瞭這一點! – 2009-11-20 03:30:32

+1

這裏有一個錯誤。沒有必要+1。例如: 由6個元素組成的數組。 第一個NSRange應該是{0,3} 第二個NSRange應該是{3,3}。在你的情況下,你會得到一個例外,因爲第二個範圍將超出範圍{4,3}。 – 2013-10-09 19:03:50

+0

謝謝,斯塔斯。我修復了這段代碼。例如: NSArray * firstHalf = [wholeArray subarrayWithRange:NSMakeRange(0,[wholeArray count]/2)];使用NSMakeRange可以使用較少的線條執行此操作,例如: – 2013-10-10 00:10:51

2

您是否嘗試過將nil添加到-initWithObjects:方法的末尾?

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil]; 
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil]; 
+0

謝謝,這樣的快速反應!我嘗試了上面的代碼,但是我得到了一個與我的類有關的錯誤,所以我認爲我錯誤地指定了NSRange。 – 2009-11-20 03:31:18

0

如果你想第一陣列中的額外的對象(如果總項目都是奇數),亞歷克斯的回答修改使用下面的代碼:

NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", nil]; 

NSArray *arrLeft; 
NSArray *arrRight; 

NSRange range; 
range.location = 0; 
range.length = ([arrayTotal count] % 2) ? ([arrayTotal count]/2) + 1 : ([arrayTotal count]/2); 

arrLeft = [arrayTotal subarrayWithRange:range]; 

range.location = range.length; 
range.length = [arrayTotal count] - range.length; 

arrRight = [arrayTotal subarrayWithRange:range]; 

NSLog(@"Objects: %lu", (unsigned long)[arrLeft count]); 
NSLog(@"%@", [arrLeft description]); 

NSLog(@"Objects: %lu", (unsigned long)[arrRight count]); 
NSLog(@"%@", [arrRight description]); 
相關問題