使用NSPredicate按关键字过滤NSArray

时间:2017-06-21 21:49:58

标签: macos cocoa nsarray nspredicate predicatewithformat

我有一个名为myArray的NSArray。我想过滤myArray个对象,以便从这个数组中排除与另一个数组keywords中的关键字对应的所有元素。

所以,那是我的伪代码:

keywords = @[@"one", @"three"];
myArray = @[@"textzero", @"textone", @"texttwo", @"textthree", @"textfour"];
predicate = [NSPredicate predicateWithFormat:@"NOT (SELF CONTAINS_ANY_OF[cd] %@), keywords];
myArray = [myArray filteredArrayUsingPredicate:predicate];

这就是我想要的NSLog(@"%@", myArray)

>> ("textzero", "texttwo", "textfour")

我该怎么做?

2 个答案:

答案 0 :(得分:0)

使用此代码:

NSArray *keywords = @[@"one", @"three"];
NSArray *myArray = @[@"textzero", @"textone", @"texttwo", @"textthree", @"textfour"];
NSString * string = [NSString stringWithFormat:@"NOT SELF CONTAINS[c] '%@'", [keywords componentsJoinedByString:@"' AND NOT SELF CONTAINS[c] '"]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:string];
NSArray* filteredData = [myArray filteredArrayUsingPredicate:predicate];
NSLog(@"Complete array %@", filteredData);

答案 1 :(得分:0)

您可以使用块来过滤数组。通常一个块更快。

keywords = @[@"one", @"three"];
myArray = @[@"textzero", @"textone", @"texttwo", @"textthree", @"textfour"];
predicate = [NSPredicate predicateWithBlock:^(NSString *evaluatedObject, NSDictionary<NSString *,id> *bindings){
    for (NSString *key in keywords)
        if ([evaluatedObject rangeOfString:key options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch].location != NSNotFound)
            return NO;
    return YES;
}];
myArray = [myArray filteredArrayUsingPredicate:predicate];

keywords = @[@"one", @"three"];
myArray = @[@"textzero", @"textone", @"texttwo", @"textthree", @"textfour"];
NSIndexSet *indices = [myArray indexesOfObjectsPassingTest:^(NSString *obj, NSUInteger idx, BOOL *stop){
    for (NSString *key in keywords)
        if ([obj rangeOfString:key options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch].location != NSNotFound)
            return NO;
    return YES;
}];
myArray = [myArray objectsAtIndexes:indices];