Iphone 更有效的方法是遍历NSString数组并比较它们
我只是在寻找一种更好、更有效的方法来迭代给定的对象数组,并将每个对象的Iphone 更有效的方法是遍历NSString数组并比较它们,iphone,ios,cocoa,nsstring,Iphone,Ios,Cocoa,Nsstring,我只是在寻找一种更好、更有效的方法来迭代给定的对象数组,并将每个对象的NSString属性与另一个只包含NSString的数组进行比较 我当前的代码使用两个for-each循环,但它不认为这是最有效的方法 for (MYClass *foo in arrayOfMyClass) { for (NSString *ID in arrayOfStringIDs) { if ([foo.Id isEqualToString:ID]) { //Do som
NSString
属性与另一个只包含NSString的数组进行比较
我当前的代码使用两个for-each循环,但它不认为这是最有效的方法
for (MYClass *foo in arrayOfMyClass) {
for (NSString *ID in arrayOfStringIDs) {
if ([foo.Id isEqualToString:ID]) {
//Do something
break;
}
}
}
我认为用一些很酷的技巧至少可以删除一个循环。检查Nsarray的indexofobject方法。可能它可以帮助您直接获取索引,而不是nsarray中字符串的循环。检查nsarray的IndexOfoObject方法。可能它可以帮助您直接获取索引,而不是nsarray中字符串的循环。如果您只想知道
foo.Id
是否存在于ArrayOfsTringID
中,请使用NSSet字符串。然后你可以做:
NSSet * mySetOfStringIDs = [NSSet setWithArray:arrayOfStringIDs];
for(MyClass * foo in arrayOfMyClass) {
if([mySetOfStringIDs containsObject:foo.Id]) {
// Do something
break;
}
}
这避免了第二个循环,因为对于集合而言,
containsObject:
通常比O(n)快得多。当然,您应该根据需要进行自己的分析。如果您只想知道foo.Id
是否存在于arrayofstringid
中,请使用一组字符串。然后你可以做:
NSSet * mySetOfStringIDs = [NSSet setWithArray:arrayOfStringIDs];
for(MyClass * foo in arrayOfMyClass) {
if([mySetOfStringIDs containsObject:foo.Id]) {
// Do something
break;
}
}
这避免了第二个循环,因为对于集合而言,
containsObject:
通常比O(n)快得多。当然,您应该根据需要进行自己的分析。如果您想获得同时存在于arrayOfMyClass
和ArrayOfString
中的字符串数组,那么您可以使用键值编码从arrayOfMyClass
中提取字符串集,并将结果集与ArrayOfString
相交。如果您的类符合KVC,那么您可以将所有Id
字符串作为一个集合从中取出:
NSMutableSet *idSet=[NSMutableSet setWithArray:[arrayOfMyClass
valueForKeyPath:@"@distinctUnionOfObjects.Id"]];
[idSet intersectSet:[NSSet setWithArray:arrayOfStringIDs]];
NSArray *idArray=[idSet allObjects];
不幸的是,没有一种方法可以将两个
NSArray
s相交,这就是为什么必须首先将它们转换为一个集合。如果希望获得同时存在于ArrayOfCyclass
和ArrayOfStringId
中的字符串数组,则可以使用键值编码将该字符串集合从ArrayOfCyclass
并将结果集与ArrayOfStringId
相交。如果您的类符合KVC,那么您可以将所有Id
字符串作为一个集合从中取出:
NSMutableSet *idSet=[NSMutableSet setWithArray:[arrayOfMyClass
valueForKeyPath:@"@distinctUnionOfObjects.Id"]];
[idSet intersectSet:[NSSet setWithArray:arrayOfStringIDs]];
NSArray *idArray=[idSet allObjects];
不幸的是,没有一种方法可以使两个
NSArray
s相交,这就是为什么必须首先将它们转换为一个集合。没有,因为我必须尝试该数组中的每个对象。indexofobject也将以同样的方式进行。它将检查给定的对象索引而不进入循环。现在我明白你的意思了。是的,这也是一个有效的aproach。否,因为我必须尝试该数组中的每个对象。indexofobject也将以同样的方式执行。它将检查给定的对象索引而不进入循环。现在我明白你的意思了。是的,这也是一个有效的循环。这实际上比第二个循环快吗?我的意思是,你是做什么的?我只是好奇。我不能肯定,因为这是非常稀疏的。不过,针对此类集合的优化算法将使用某种哈希存储对象,然后依靠使用传递的对象的哈希快速查找集合中是否已存在匹配对象。通常,这是在O(1)中平均完成的。通过DOCS读取更多信息,您也可以考虑使用<代码>成员:< /COD>而不是<代码>包容对象:< /代码>如果后者给您带来麻烦;代码>成员:被记录为显式地使用isEqual:
,这与实现它的对象的哈希有着非常密切的关系。非常有趣。我肯定没有任何性能问题,因为字符串数组只有几个(4~5)项,而其他数组只有大约100项,但我仍然很好奇。NSString(以及大多数其他有意义的框架类)使用适当的实现重写isEqual:
。这真的比第二个循环快吗?我的意思是,你是做什么的?我只是好奇。我不能肯定,因为这是非常稀疏的。不过,针对此类集合的优化算法将使用某种哈希存储对象,然后依靠使用传递的对象的哈希快速查找集合中是否已存在匹配对象。通常,这是在O(1)中平均完成的。通过DOCS读取更多信息,您也可以考虑使用<代码>成员:< /COD>而不是<代码>包容对象:< /代码>如果后者给您带来麻烦;代码>成员:
被记录为显式地使用isEqual:
,这与实现它的对象的哈希有着非常密切的关系。非常有趣。我肯定没有任何性能问题,因为字符串数组只有几个(4~5)项,其他数组只有大约100项,但我仍然很好奇。NSString(以及大多数其他有意义的框架类)使用适当的实现重写isEqual:
。