2012-04-04 5 views
5

Quindi, in pratica, ho un NSArray.Filtering NSArray string elements

Voglio ottenere una matrice con il contenuto della matrice iniziale dopo aver filtrato quelli ad es. NON inizia da un prefisso dato.

Pensare di utilizzare filteredArrayUsingPredicate: è il modo migliore; ma non sono sicuro di come avrei potuto farlo ...

Questo è il mio codice finora (in una categoria NSArray in realtà):

- (NSArray*)filteredByPrefix:(NSString *)pref 
{ 
    NSMutableArray* newArray = [[NSMutableArray alloc] initWithObjects: nil]; 

    for (NSString* s in self) 
    { 
     if ([s hasPrefix:pref]) [newArray addObject:s]; 
    } 

    return newArray; 
} 

E 'il più approccio di cacao-friendly? Quello che voglio è qualcosa di più veloce possibile ...

risposta

16

Ecco un modo molto più semplice utilizzando filteredArrayUsingPredicate::

NSArray *filteredArray = [anArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF like %@", [pref stringByAppendingString:@"*"]]; 

Questo consente di filtrare la matrice verificando che corrisponda alla stringa composta da prefisso seguito da un carattere jolly.

Se si desidera verificare il prefisso caso in modo insensibile, utilizzare invece like[c].

+0

Ottima risposta. Grazie! ;-) –

+1

Grazie, ho usato questo per confrontare la stringa ovunque nella parola: '[NSPredicate predicateWithFormat: @" SELF come [c]% @ ", [NSString stringWithFormat: @" *% @ * ", parola chiave]]' – atulkhatri

1

Puoi usare -indexesOfObjectsPassingTest :. Per esempio:

NSIndexSet* indexes = [anArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
    return [obj hasPrefix:pref]; 
}]; 
NSArray* newArray = [anArray objectsAtIndexes:indexes]; 
1

È inoltre possibile utilizzare il metodo indexOfObjectPassingTest: della classe NSArray. Disponibile in Mac OS X v10.6 e successivo.

@implementation NSArray (hasPrefix) 

-(NSMutableArray *)filteredByPrefix:(NSString *)pref 
{ 
    NSMutableArray* newArray = [[NSMutableArray alloc] initWithCapacity:0]; 

    NSUInteger index = [self indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
     if ([ obj hasPrefix:pref]) { 
      [newArray addObject:obj]; 
      return YES; 
     } else 
      return NO; 
    }]; 

    return [newArray autorelease]; 

} 

@end