2009-11-20 11 views
13

que tienen un NSArray, y quiero dividirlo en dos partes iguales (si es impar "recuento" y luego añadir a éste nuevo array) - Quiero dividirlo "por la mitad" por así decirlo.¿Cómo dividir un NSArray en dos partes iguales?

El siguiente código hace exactamente lo que quiero, pero hay una manera mejor ?:

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

Una vez que se hacen leftArray y rightArray, no voy a cambiar, por lo que no tiene por qué ser "mutable ". Creo que puede ser una manera de lograr el código anterior con el método ObjectsAtIndexes o algún método de enumeración rápida ?, pero no puedo obtener el código siguiente al trabajo (u otras variantes):

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

¿Alguien sabe si ¿Voy en la dirección correcta con esto o me señalas en la dirección correcta?

Gracias!

Respuesta

40

También tienen la opción de usar -subarrayWithRange: se detalla en la documentación 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]; 

Este método devuelve nueva, autorelease matrices -d.

+0

Alex, ¡gracias por tu (s) respuesta (s) ultra rápida (s)! Su segunda solución es mucho mejor. Creo que me obsesioné mucho con la implementación de NSRange, que también expusiste muy claramente en el ejemplo anterior. –

+1

hay un error aquí. No hay necesidad de +1. Ejemplo: una matriz de 6 elementos. el primer NSRange debe ser {0, 3} el segundo NSRange debe ser {3, 3}. En su caso, obtendrá una excepción porque el segundo rango estaría fuera de los límites {4, 3}. –

+0

Gracias, Stas. Arreglé este código –

2

Ha intentado añadir nil al final del método -initWithObjects:?

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

Gracias, una respuesta tan rápida! Probé el código anterior, pero aparece un error relacionado con mi clase, por lo que creo que estoy especificando NSRange incorrectamente. –

0

Si desea que un objeto extra en primera matriz (en el caso de artículos totales son impares), el uso siguiente código modificado a partir de la respuesta de 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]); 
Cuestiones relacionadas