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;
}

它是对 Cocoa 最友好的方法吗?我想要的是尽可能快的东西......

4

3 回答 3

16

这是一个更简单的使用方法filteredArrayUsingPredicate:

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

这将通过检查它是否匹配由前缀和通配符组成的字符串来过滤数组。

如果要不区分大小写地检查前缀,请like[c]改用。

于 2012-04-04T09:41:44.400 回答
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
于 2012-09-11T13:10:10.303 回答
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 回答