1

我正在遍历一个数组并将此数组中的 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

4 回答 4

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];
    }
}
于 2011-09-26T16:56:18.013 回答
1

好吧,最简单的更改(因为每个 objectA 只能有一个匹配项)然后您可以在 [mutableArray addObject:objectA] 之后进行休息。当匹配发生时,内循环会减少 50%。

更戏剧性的是,如果您经常这样做并且 anotherObjectArray 的顺序无关紧要,则可以反转您的 anotherObjectArray 数据结构并使用字典,按标签存储对象。然后你只需遍历 objectA 询问它的标签是否在 ObjectZs 的字典中。

于 2011-09-26T16:57:44.300 回答
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);
}

希望这可以帮助

于 2011-09-26T17:12:10.987 回答
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];
    }
}
于 2011-09-26T20:07:39.990 回答