这个2x快速枚举的更好解决方案?

时间:2011-09-26 16:25:51

标签: objective-c nsarray fast-enumeration

我循环遍历一个数组,并将此数组中的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属性不是整数,因此必须比较字符串。

4 个答案:

答案 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];
    }
}