2012-04-04 12 views
5

Así que, básicamente tengo un NSArray.Filtrando elementos de cadena NSArray

Quiero obtener una matriz con los contenidos de la matriz inicial después de haber filtrado aquellos, p. NO comienza por un prefijo dado.

Piensa que usar filteredArrayUsingPredicate: es la mejor manera; pero no estoy seguro de cómo podría hacerlo ...

Este es mi código hasta ahora (en una categoría NSArray en realidad):

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

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

    return newArray; 
} 

¿Es el enfoque más cacao ambiente? Lo que quiero es algo lo más rápido posible ...

Respuesta

16

Aquí está una manera mucho más sencilla utilizando filteredArrayUsingPredicate::

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

Esto filtra la matriz comprobando que coincide con la cadena formada por el prefijo seguido por un comodín.

Si desea verificar el prefijo sin tener en cuenta las mayúsculas y minúsculas, utilice like[c].

+0

Great answer. ¡Gracias! ;-) –

+1

Gracias, utilicé esto para comparar cadenas en cualquier parte de la palabra: '[NSPredicate predicateWithFormat: @" SELF como [c]% @ ", [NSString stringWithFormat: @" *% @ * ", keyword]]' – atulkhatri

1

Puede usar -indexesOfObjectsPassingTest :. Por ejemplo:

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

También puede usar el método indexOfObjectPassingTest: de la clase NSArray. Disponible en Mac OS X v10.6 y posterior.

@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 
Cuestiones relacionadas