2012-07-18 73 views
0

我只是寻找一种更好,更有效的方式来遍历给定的对象数组,并将每个对象的NSString属性与仅包含NSStrings的另一个数组进行比较。更有效的方式来遍历NSString的数组并进行比较

我目前的代码使用两个for-each循环,但它不认为这是最有效的方法。

for (MYClass *foo in arrayOfMyClass) { 
    for (NSString *ID in arrayOfStringIDs) { 
     if ([foo.Id isEqualToString:ID]) { 
      //Do something 
      break; 
     } 
    } 
} 

我认为应该以某种方式放弃至少一个循环与一些很酷的技巧。

回答

4

如果您想知道的是如果foo.Id存在于arrayOfStringIDs中,请改为使用NSSet字符串。然后,你可以这样做:

NSSet * mySetOfStringIDs = [NSSet setWithArray:arrayOfStringIDs]; 
for(MyClass * foo in arrayOfMyClass) { 
    if([mySetOfStringIDs containsObject:foo.Id]) { 
     // Do something 
     break; 
    } 
} 

这就避免了第二循环,因为containsObject:一般比O(n)的快得多一组。当然,您应该根据需要进行自己的分析。

+0

听起来很完美。谢谢。 – yinkou 2012-07-18 22:00:22

+0

这是否比第二个循环更快? 我的意思是,什么containsObject:做?我只是好奇。 – yinkou 2012-07-20 19:08:53

+0

我无法确定,因为[documentation](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html)很漂亮疏。然而,这种集合的优化算法会使用某种散列存储对象,然后依靠使用传递的对象的散列快速查找集合中是否存在匹配对象。通常,这在O(1)中平均完成。 – Tim 2012-07-20 20:11:46

1

检查Nsarray的indexofobject方法。可能是它可以帮助您直接获取索引而不是nsarray中的字符串循环。

+0

不,因为我必须尝试该数组中的每个对象。 – yinkou 2012-07-18 21:56:14

+1

indexofobject也将采用相同的方式。它会检查给定的对象索引而不进入循环。 – iCreative 2012-07-18 22:00:13

+0

现在我明白你的意思了。是的,这也是一个有效的方法。 – yinkou 2012-07-18 22:04:47

0

如果你想同时存在于两个arrayOfMyClassarrayOfStringIDs那么你可以使用键 - 值编码拉动琴弦组的出arrayOfMyClass和交叉设置与arrayOfStringIDs生成的字符串数组。如果您的类是KVC兼容的,那么你可以得到所有的Id串出它作为一组:

NSMutableSet *idSet=[NSMutableSet setWithArray:[arrayOfMyClass 
    valueForKeyPath:@"@distinctUnionOfObjects.Id"]]; 
[idSet intersectSet:[NSSet setWithArray:arrayOfStringIDs]]; 
NSArray *idArray=[idSet allObjects]; 

不幸的是,没有相交2 NSArray个方法,这就是为什么他们要变成一个集第一。

相关问题