2011-07-10 4 views
2

Je peux utiliser [NSArray indexOfObject: NSString] pour obtenir un index de ma recherche pour 1 élément. Mais que puis-je utiliser ou faire pour obtenir un tableau d'indices renvoyés de ma recherche?Comment obtenir des indices de NSArray en utilisant quelque chose comme indexOfObject?

grâce

+0

Voulez-vous rechercher un élément qui peut être répété dans le tableau, ou rechercher plusieurs éléments à la fois? – outis

+0

J'ai un NSArray de 1000 NSStrings que je recherche un NSString particulier qui peut renvoyer plusieurs index pour leurs emplacements. –

+0

http://stackoverflow.com/questions/905828/get-nsindexset-from-nsarray –

Répondre

6

Pour obtenir plusieurs indices, vous pouvez utiliser indexesOfObjectsPassingTest::

// a single element to search for 
id target; 
// multiple elements to search for 
NSArray *targets; 
... 
// every index of the repeating element 'target' 
NSIndexSet *targetIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) { 
     return [obj isEqual:target]; 
    }]; 

// every index of every element of 'targets' 
NSIndexSet *targetsIndices = [array indexesOfObjectsPassingTest:^ BOOL (id obj, NSUInteger idx, BOOL *stop) { 
     return [targets containsObject:obj]; 
    }]; 

Prise en charge des blocs ont été ajoutés dans iOS 4. Si vous avez besoin de soutenir les versions antérieures d'iOS, indexesOfObjectsPassingTest: est pas un option. Au lieu de cela, vous pouvez utiliser indexOfObject:inRange: pour rouler votre propre méthode:

@interface NSArray (indexesOfObject) 
-(NSIndexSet *)indexesOfObject:(id)target; 
@end 

@implementation NSArray (indexesOfObject) 
-(NSIndexSet *)indexesOfObject:(id)target { 
    NSRange range = NSMakeRange(0, [self count]); 
    NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init]; 
    NSUInteger idx; 
    while (range.length && NSNotFound != (idx = [self indexOfObject:target inRange:range])) { 
     [indexes addIndex: idx]; 
     range.length -= idx + 1 - range.location; 
     range.location = idx + 1; 
    } 
    return [indexes autorelease]; 
} 
@end 
+0

Nous vous remercions de votre aide –

1

Si vous n'avez pas accès à indexOfObjectsPassingTest, comme @outis recommande, vous pouvez utiliser indexOfObject:inRange: et boucle sur les résultats, la mise à jour de la gamme de démarrer après le dernier résultat est terminé et la mise à jour des résultats dans votre propre NSIndexSet, ou NSMutableArray, etc.

Questions connexes