我循环遍历一个数组,并将此数组中的objects标记属性与另一个数组中的对象进行比较。
这是我的代码:
NSArray *objectsArray = ...;
NSArray *anotherObjectArray = ...;
NSMutableArray *mutableArray = ...;
for (ObjectA *objectA in objectsArray) {
for (ObjectZ *objectZ in anotherObjectArray) {
if ([objectA.tag isEqualToString:objectZ.tag]) {
[mutableArray addObject:objectA];
}
}
}
有更好的方法吗?
请注意tag
属性不是整数,因此必须比较字符串。
答案 0 :(得分:5)
您可以通过迭代每个数组一次而不是嵌套来完成此操作:
NSMutableSet *tagSet = [NSMutableSet setWithCapacity:[anotherObjectArray count]];
for(ObjectZ *objectZ in antherObjectArray) {
[tagSet addObject:objectZ.tag];
}
NSMutableArray *output = [NSMutableArray mutableArray];
for(ObjectA *objectA in objectsArray) {
if([tagSet containsObject:objectA.tag]) {
[output addObject:objectA];
}
}
答案 1 :(得分:1)
嗯,最简单的更改(因为每个objectA只能有一个匹配)然后你可以在[mutableArray addObject:objectA]之后休息一下。当匹配发生时,这将使内循环减少50%。
更显着的是,如果你这么做并且anotherObjectArray的顺序无关紧要,那就是反转你的anotherObjectArray数据结构并使用字典,按标签存储对象。然后你只需迭代objectA,询问它的标签是否在ObjectZs的字典中。
答案 2 :(得分:1)
可能你可以使用[NSArray filteredArrayUsingPredicate:]; - http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html
但您可能需要自己调整属性标记。
NSArray *objectsArray = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];
NSArray *tagsArray = [NSArray arrayWithObjects:@"Miguel", @"Adam", nil];
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", tagsArray];
NSArray *results = [objectsArray filteredArrayUsingPredicate:sPredicate];
NSLog(@"Matched %d", [results count]);
for (id a in results) {
NSLog(@"Object is %@", a);
}
希望这有帮助
答案 3 :(得分:0)
感谢所有答案。虽然我已经接受了NSMutableSet解决方案,但实际上我最终得到了以下内容,因为事实证明它的速度要快一点:
NSMutableDictionary *tagDictionary = [NSMutableDictionary dictionaryWithCapacity:[anotherObjectArray count]];
for (ObjectZ *objectZ in anotherObjectArray) {
[tagDictionary setObject:objectZ.tag forKey:objectZ.tag];
}
for (ObjectA *objectA in objectsArray) {
if ([tagDictionary objectForKey:objectA.tag]) {
[direction addObject:objectA];
}
}