优雅地比较两个NSArrays中的字符串

时间:2010-11-03 14:07:53

标签: objective-c

亲爱的。我们有2个数组(currentCarriers和带有字符串的companyList。最终的解决方案必须是数组,它从第一个数组中排除相同的字符串。 贝娄是我的解决方案,但可能两个for循环不像可可风格。也许有人可以提出更好的建议?

for (NSString *carrier in currentCarriers) {
    for (NSString *company in  companyList)
    {
        if ([company isEqualToString:carrier]) [removedCompanies addObject:company];        }
}    

NSMutableArray *companiesForAdd = [NSMutableArray arrayWithArray:companyList];
[companiesForAdd removeObjectsInArray:removedCompanies];

3 个答案:

答案 0 :(得分:5)

将一个列表转换为可变数组,然后使用removeObjectsInArray:,如:

foo = [NSMutableArray arrayWithArray:currentCarriers];
[foo removeObjectsInArray:companyList];
// foo now contains only carriers that are not in the company list.

修改

替代设置差异(但在大多数情况下由于复制/分配可能会更慢):

NSMutableSet *foo = [NSMutableSet setWithArray:currentCarriers];
[foo minusSet:[NSSet setWithArray:companyList]];

对于较大的列表,这可能会更快,但是您会丢失排序(如果有的话)。

答案 1 :(得分:2)

我想你可以使用NSArray的-containsObject:方法摆脱内循环,类似

for (NSString *carrier in currentCarriers) {
    if ([companyList containsObject:carrier])
        [removedCompanies addObject:company];       
}    

NSMutableArray *companiesForAdd = [NSMutableArray arrayWithArray:companyList];
[companiesForAdd removeObjectsInArray:removedCompanies];

答案 2 :(得分:0)

我可以建议两个选项

  • 如果您担心性能,那么您可以对数组进行排序,然后一次性创建结果。
  • 如果您不担心,请使用currentCarriers
  • 过滤[companyList containsObject:]