5

だから、基本的に私は持ってい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;
}

それは最もココアに優しいアプローチですか?私が欲しいのはできるだけ速いものです...

4

3 に答える 3

16

これは、以下を使用するはるかに簡単な方法filteredArrayUsingPredicate:です。

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

これは、プレフィックスとそれに続くワイルドカードで構成される文字列と一致することを確認することにより、配列をフィルタリングします。

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

于 2012-04-04T09:41:44.400 に答える
1

-indexesOfObjectsPassingTest:を使用できます。例えば:

NSIndexSet* indexes = [anArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    return [obj hasPrefix:pref];
}];
NSArray* newArray = [anArray objectsAtIndexes:indexes];
于 2012-04-04T09:41:32.700 に答える
1

クラスindexOfObjectPassingTest: のメソッドを使用することもできます。Mac OSXv10.6以降で利用できます。 NSArray

@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
于 2012-09-11T13:10:10.303 に答える