所以,基本上我有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方法吗?我想要的是尽可能快的东西......
答案 0 :(得分:16)
使用filteredArrayUsingPredicate:
:
NSArray *filteredArray = [anArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF like %@", [pref stringByAppendingString:@"*"]];
通过检查数组是否匹配由前缀后跟通配符组成的字符串来过滤数组。
如果您想不区分大小写检查前缀,请改用like[c]
。
答案 1 :(得分:1)
您可以使用-indexesOfObjectsPassingTest:。例如:
NSIndexSet* indexes = [anArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
return [obj hasPrefix:pref];
}];
NSArray* newArray = [anArray objectsAtIndexes:indexes];
答案 2 :(得分: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