2009-11-20 5 views
13

J'ai un NSArray, et je veux le diviser en deux parties égales (si impair "compter" alors ajouter au dernier nouveau tableau) - je veux le diviser "vers le milieu" pour ainsi dire.Comment diviser un NSArray en deux parties égales?

Le code suivant fait exactement ce que je veux, mais est-il une meilleure façon ?:

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

Une fois leftArray et rightArray sont faits, je ne vais pas les changer, donc ils ne pas besoin d'être « mutable ". Je pense qu'il peut y avoir un moyen d'accomplir le code ci-dessus avec la méthode ObjectsAtIndexes ou une méthode de dénombrement rapide ?, mais je ne peux pas obtenir le code suivant au travail (ou d'autres variations):

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

Est-ce que quelqu'un sait si je vais-je dans la bonne direction avec ceci ou pointez-moi dans la bonne direction?

Merci!

Répondre

40

Vous avez également la possibilité d'utiliser -subarrayWithRange: détaillées dans la documentation 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]; 

Cette méthode retourne nouvelle, autorelease tableaux -d.

+0

Alex, merci pour votre réponse (s) ultra-rapide! Votre deuxième solution est beaucoup mieux. Je pense que je me suis trop accroché à l'implémentation de NSRange, que vous avez également tracée très clairement dans l'exemple ci-dessus! –

+1

il y a un bug ici. Il n'y a pas besoin de +1. Exemple: un tableau de 6 éléments. la première NSRange devrait être {0, 3} la seconde NSRange devrait être {3, 3}. Dans votre cas, vous obtiendrez une exception car la deuxième plage serait hors limites {4, 3}. –

+0

Merci, Stas. J'ai corrigé ce code. –

2

Avez-vous essayé d'ajouter nil à la fin de la méthode -initWithObjects:?

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

Merci, cette réponse rapide! J'ai essayé le code ci-dessus, mais j'ai une erreur liée à ma classe, donc je pense que je spécifie incorrectement NSRange. –

0

Si vous voulez un objet supplémentaire sur le premier tableau (en cas articles au total sont impairs), utilisez le code suivant modifié de la réponse d'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]);