views:

447

answers:

2

I have an NSArray, and I want to split it into two equal pieces (if odd "count" then add to the latter new array) - I want to split it "down the middle" so to speak.

The following code does exactly what I want, but is there a better way?:

// 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]];
 }
}

Once leftArray and rightArray are made, I will not change them, so they do not need to be "mutable". I think there may be a way to accomplish the above code with the ObjectsAtIndexes method or some fast enumeration method?, but I cannot get the following code to work (or other variations):

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

Does anyone know if I am going in the right direction with this or point me in the correct direction?

Thanks!

+1  A: 

Have you tried adding nil to the end of the -initWithObjects: method?

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil];
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil];
Alex Reynolds
Thanks, such a quick response! I tried the above code, but I get an error related to my class, so I think I am specifying NSRange incorrectly.
J. Dave
+6  A: 

You also have the option of using -subarrayWithRange: detailed in the NSArray documentation:

NSArray *halfArray;
NSRange theRange;

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

halfArray = [wholeArray subarrayWithRange:theRange];
Alex Reynolds
Alex, thanks for your ultra-quick response(s)!Your second solution is much better. I think I got too hung up implementing NSRange, which you also laid out very clearly in the above example!
J. Dave