3

特定の文字を含む配列内のすべてのオブジェクトを見つける NSPredicate をどのように作成しますか?

NSMutableArray *testArray = [[NSMutableArray alloc] initWithObjects:@"abc",@"cba", @"bca", nil];

NSPredicate *p = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@",@"abc"];

NSMutableArray *result = (NSMutableArray *)[testArray filteredArrayUsingPredicate: p];

結果には、@"abc" という 1 つのオブジェクトのみが含まれています... "abc" を含むすべての単語をキャッチしたいと考えています。(例: "cba"、"cba"、"lllllllllbbacllllll" など)。

4

3 に答える 3

2

他の答えには何の問題もありません。ただし、述語を作成する別の方法、つまりブロックを使用する方法を提案したいと思いました。

NSArray *testArray = @[@"abc", @"cba", @"cda"];
NSArray *letters = @[@"a", @"b", @"c"];

NSPredicate *p = [NSPredicate predicateWithBlock:^BOOL(id string, NSDictionary *bindings) {
    for ( NSString *letter in letters ) {
        NSStringCompareOptions options = NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch;
        if ( ! [string rangeOfString:letter options:options].length ) {
            return NO;
        }
    }
    return YES;
}];
NSArray *result = [testArray filteredArrayUsingPredicate:p];

そして、楽しみのために、サブクエリを使用して述語を記述することもできます。これは効率が悪くなりますが、より短い解決策です。

NSArray *testArray = @[@"abc", @"cba", @"bcda"];
NSArray *letters = @[@"a", @"b", @"c"];

NSPredicate *p = [NSPredicate predicateWithFormat:@"SUBQUERY(%@, $a, self CONTAINS[cd] $a)[SIZE] == %d", letters, letters.count];
NSArray *result = [testArray filteredArrayUsingPredicate:p];
于 2013-01-15T15:32:54.637 に答える
2

単一の述語でそれが可能かどうかはわかりませんが、次を使用して複合述語を作成できますNSCompoundPredicate

NSMutableArray *testArray = [[NSMutableArray alloc] initWithObjects:@"abc",@"cba", @"bca", nil];

NSMutableArray *predicates = [NSMutableArray array];
for (NSString *substring in @[@"a", @"b", @"c"]) {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", substring];
    [predicates addObject:predicate];
}
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

NSArray *result = [testArray filteredArrayUsingPredicate:compoundPredicate];

ニコラスのコメントもご覧くださいfilteredArrayUsingPredicate

于 2013-01-15T14:46:10.877 に答える
1

文字を個別にテストして、これを試してください:

NSMutableArray *testArray = [[NSMutableArray alloc] initWithObjects:@"abc",@"cba", @"bca", nil];
NSPredicate *p = [NSPredicate predicateWithFormat:@"self contains 'a' && self contains 'b' && self contains 'c'"];
NSMutableArray *result = [[testArray filteredArrayUsingPredicate: p] mutableCopy];
于 2013-01-15T14:49:05.773 に答える