2012-04-04 2 views
5

Итак, в основном у меня есть NSArray.Фильтрация элементов строки NSArray

Я хочу получить массив с содержимым исходного массива после того, как он отфильтровал их, например. НЕ начинается с данного префикса.

Он думает, используя filteredArrayUsingPredicate: - лучший способ; но я не уверен, о том, как я могу это сделать ...

Это мой код до сих пор (в NSArray категории на самом деле):

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

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

    return newArray; 
} 

Это наиболее Какао-дружественный подход? Я хочу как можно быстрее ...

ответ

16

Вот более простой способ использования filteredArrayUsingPredicate::

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

Это фильтрует массив, проверяя, что она совпадает со строкой, составленную из вашего префикса с последующим групповым символом.

Если вы хотите проверить префикс без учета регистра, используйте вместо этого like[c].

+0

Отличный ответ. Благодаря! ;-) –

+1

Спасибо, я использовал это, чтобы сравнить строку в любом месте слова: '[NSPredicate predicateWithFormat: @" SELF как [c]% @ ", [NSString stringWithFormat: @" *% @ * ", keyword]]' – atulkhatri

1

Вы можете использовать -indexesOfObjectsPassingTest :. Например:

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

Вы также можете использовать indexOfObjectPassingTest: метод NSArray класс. Доступен в Mac OS X v10.6 и более поздних версиях.

@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 
Смежные вопросы