2012-04-04 4 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; 
} 

は、それはほとんどのCocoaフレンドリーなアプローチですか?私が望むのはできるだけ速いものです...

答えて

16

はここfilteredArrayUsingPredicate:を使用してはるかに簡単な方法です:

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

これは、ワイルドカードに続いて、あなたの接頭辞で構成された文字列と一致していることをチェックすることにより、配列をフィルタリングします。

大文字と小文字を区別しない接頭辞を確認する場合は、代わりにlike[c]を使用してください。

+0

偉大な答え。ありがとう! ;-) –

+1

ありがとう、私は単語のどこでも文字列を比較するためにこれを使いました: '[NSPredicate predicateWithFormat:@" [c]%@ "のようなSELF、[NSString stringWithFormat:@" *%@ * "、キーワード]]' – 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 
関連する問題