首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios -从其他NSSet中减去NSSet

ios -从其他NSSet中减去NSSet
EN

Stack Overflow用户
提问于 2015-01-19 13:29:51
回答 3查看 3.4K关注 0票数 2

我有两个NSSet,一个包含所有UserKeys,另一个包含在线用户键。我想在两个部分中显示这个值。第1节-在线用户和section2 -其他用户

我这样做是使用谓词,如下所示。

代码语言:javascript
复制
NSSet *nsset1 = [NSSet setWithArray:attendeesService.arrof_attendeeList]; //this are all users
nsset2 = [NSSet setWithArray:tempArray]; // temparray contains all online users.
NSSet *nsset2_ids = [nsset2 valueForKey:@"UserProfileKEY"]; 
nsset1_minus_nsset2 = [nsset1 filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"NOT UserProfileKEY IN %@",nsset2_ids]]; 

效果很好。但是所有的用户都是关于3000+的,在线用户一次可能是200+。所以这需要很长时间。4到5个在线用户只需1分钟.因此,对于200+,在线用户将需要更多的时间。有更快的解决办法吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-19 13:40:55

您的第一个数组是FirstMakes声明是:

代码语言:javascript
复制
NSArray *FirstMakes = @[@"Mercedes-Benz", @"BMW", @"Porsche",
                         @"Opel", @"Volkswagen", @"Audi"];

您的第二个数组是SecondMakes声明是:

代码语言:javascript
复制
NSArray *SecondMakes = @[@"Mercedes-Benz", @"Porsche",
                          @"Volkswagen"];

Filter `FirstMakes` to `SecondMakes`

NSPredicate *beforeL = [NSPredicate predicateWithBlock:
                            ^BOOL(id evaluatedObject, NSDictionary *bindings)
                             {

                                 if ([SecondMakes containsObject:evaluatedObject])
                                 {
                                     return NO;
                                 }
                                 else{
                                     return YES;
                                 }

                            }];
    NSArray *makesBeforeL = [FirstMakes
                             filteredArrayUsingPredicate:beforeL];

    NSLog(@"%@", makesBeforeL);

您的输出是:

票数 1
EN

Stack Overflow用户

发布于 2015-01-19 13:39:33

使用来自minusSetNSMutableSet

minusSet:如果存在,则从接收集中移除另一个给定集合中的每个对象。

代码语言:javascript
复制
NSMutableSet *nsset1 = [NSMutableSet setWithArray: attendeesService.arrof_attendeeList];
NSSet *set2 = [NSSet setWithArray: tempArray];
[nsset1 minusSet: set2];
NSArray *nsset1_minus_nsset2 = [nsset1 allObjects];
票数 11
EN

Stack Overflow用户

发布于 2015-01-19 13:40:54

创建集合的代价很高-- NSSet必须一次一个地遍历一个对象的列表,要求它们计算散列,然后将它们插入桶中,这至少需要一些动态分配。

因此,如果可能的话,不要每次运行此测试时都重新创建nsset1nsset2。在运行时将它们保持为集,即使这意味着往返于一个数组来存储到磁盘。

集上的valueForKey:也是一个集创建任务。尽量别那么做。至少切换到nsset2_ids = [NSSet setWithArray:[tempArray valueForKey:@"UserProfileKEY"]];,只创建一组而不是两组。

NSMutableSet上使用NSMutableSet,以防止解析和应用自由形式谓词的成本。

如果可能的话,让这两个集合包含相同类型的对象,并正确地实现isEqual:hash,这样首先就不需要转换(您通过valueForKey:实现的转换)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28025771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档