Как разбить 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(????, ????)]]];
Кто-нибудь знает, схожу ли я в правильном направлении с этим или укажу на меня в правильном направлении?
Спасибо!
Ответы
Ответ 1
У вас также есть возможность использовать -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 массивы.
Ответ 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];
Ответ 3
Если вам нужен дополнительный объект для первого массива (в случае, если общие элементы нечетные), используйте следующий код, измененный из ответа Alex:
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]);