2009-11-20 63 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]); 
相关问题