我可以将 NSPredicate 与 NSSet 一起使用吗

she*_*ath 1 xcode objective-c nsset ios

我想得到两个 NSSet 的交集,默认情况下 NSSset 比较对象的每个成员,以得出 SetA 和 SetB 中的交集对象。

这是我的代码。

NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
[dic setObject:@"25" forKey:@"age"];
[dic setObject:@"abc" forKey:@"Name"];

NSMutableDictionary *dic1 = [[NSMutableDictionary alloc]init];
[dic1 setObject:@"21" forKey:@"age"];
[dic1 setObject:@"xyz" forKey:@"Name"];

NSMutableDictionary *dic2 = [[NSMutableDictionary alloc]init];
[dic2 setObject:@"20" forKey:@"age"];
[dic2 setObject:@"abc" forKey:@"Name"];

NSMutableDictionary *dic3 = [[NSMutableDictionary alloc]init];
[dic3 setObject:@"25" forKey:@"age"];
[dic3 setObject:@"abcNameNotMatch" forKey:@"Name"];

NSMutableDictionary *dic4 = [[NSMutableDictionary alloc]init];
[dic3 setObject:@"20" forKey:@"age"];
[dic3 setObject:@"abcNameNotMatch" forKey:@"Name"];

NSArray *a = [NSArray arrayWithObjects:dic,dic1,dic2, nil];
NSArray *b = [NSArray arrayWithObjects:dic3,dic4, nil];

NSMutableSet *setA = [NSMutableSet setWithArray:a];
NSSet *setB = [NSSet setWithArray:b];
//[setA intersectSet:setB];
//NSLog(@"c: %@", [setA allObjects]);

[setA intersectSet:setB];

NSLog(@"d: %@", [setA allObjects]); 
Run Code Online (Sandbox Code Playgroud)

我只想根据年龄获取过滤器对象(相交)。简而言之,我可以指定 intersectSet 函数应该只比较 SetA 和 SetB.MeanWhile 的年龄,忽略名称的值。2 对象应该使用我的代码返回 dic 和 dic2 。setA 和 setB 中的相交对象是。求助。

集合A

1)dic 年龄是 25

2)dic2 年龄是 20

集合B

1)dic3 年龄是 25

2)dic4 年龄是 20

rin*_*aro 5

尝试:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age in %@.age", setB];
NSSet *result =  [setA filteredSetUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

如果要修改setA自身,请使用:

[setA filterUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

例子:

NSMutableSet *setA = [NSMutableSet setWithArray:
                      @[
                        @{@"age":@(11), @"Name":@"abc"},
                        @{@"age":@(11), @"Name":@"def"},
                        @{@"age":@(22), @"Name":@"ghi"},
                        @{@"age":@(22), @"Name":@"jkl"},
                        @{@"age":@(33), @"Name":@"lmn"},
                        @{@"age":@(33), @"Name":@"opq"},
                        ]];
NSSet *setB = [NSSet setWithArray:
               @[
                 @{@"age":@(11), @"Name":@"rst"},
                 @{@"age":@(22), @"Name":@"uvw"},
                 @{@"age":@(22), @"Name":@"xyz"},
                 ]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age in %@.age", setB];
[setA filterUsingPredicate:predicate];
NSLog(@"%@", setA);
Run Code Online (Sandbox Code Playgroud)

输出:

{(
        {
        Name = abc;
        age = 11;
    },
        {
        Name = def;
        age = 11;
    },
        {
        Name = ghi;
        age = 22;
    },
        {
        Name = jkl;
        age = 22;
    }
)}
Run Code Online (Sandbox Code Playgroud)