如何将一个NSArray分成两个相等的部分?
问题描述:
我有一个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(????, ????)]]];
有谁知道,如果我我正朝着正确的方向走,还是指向正确的方向?
谢谢!
答
您还可以使用-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阵列。
答
您是否尝试过将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
答
如果你想第一阵列中的额外的对象(如果总项目都是奇数),亚历克斯的回答修改使用下面的代码:
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]);
亚历克斯,感谢您的超快反应(S)! 你的第二个解决方案要好得多。我觉得我太执着于实施NSRange,你在上面的例子中也非常清楚地阐明了这一点! – 2009-11-20 03:30:32
这里有一个错误。没有必要+1。例如: 由6个元素组成的数组。 第一个NSRange应该是{0,3} 第二个NSRange应该是{3,3}。在你的情况下,你会得到一个例外,因为第二个范围将超出范围{4,3}。 – 2013-10-09 19:03:50
谢谢,斯塔斯。我修复了这段代码。例如: NSArray * firstHalf = [wholeArray subarrayWithRange:NSMakeRange(0,[wholeArray count]/2)];使用NSMakeRange可以使用较少的线条执行此操作,例如: – 2013-10-10 00:10:51