-4

我正在寻找完成以下任务的最有效方法......

我有一个类型的对象数组Foo,除其他属性外,Foo还有一个latitude和一个longitude属性。给定许多 's 的数组Foo,我需要将Foo具有匹配 lat / long 的 's 提取到一个新数组中。

我已经实现了几个可行的解决方案,包括使用 for 循环进行迭代,以及使用 NSPredicate 的解决方案,但是这两种方法都涉及通过数组的多次迭代。这个数组可能有数十万条记录,所以我正在寻找我可以使用的东西,它可以一次性达到预期的结果。

编辑:添加一些伪代码来描述我已经采取的方法并更好地描述问题......

NSMutableArray * matchingLocations = [[NSMutableArray alloc] initWithCapacity:0];

for (Foo * checkingFoo in fooArray) {

    NSMutableArray * checkingArray = [NSArray arrayWithArray:fooArray];
    [checkingArray removeObject:checkingFoo];        

    for (Foo * foo  in checkingArray) {

        // I have a method coded for comparing two coordinates
        if (checkingFoo.coordinate == foo.coordinate) { 

            [matchingLocations addObject:checkingFoo];                

        }

    }

}
4

3 回答 3

1

NSSet 将提供一组独特的对象。但是,为了正确实现它,您需要定义 Foo 对象的相同含义。您在 Foo 类实现中执行此操作,重写方法 isEqual: 和方法哈希。
在您的 Foo 课程中:

- (BOOL)isEqual:(id)object {
return (self.coordinate == [(Foo *)object coordinate]);

}

- (NSUInteger)hash {
return ([self.coordinate hash]);

}

然后在您的代码中的任何地方您都可以使用:

    NSArray *array; // Your array with multiple Foo objects potentiually duplicates
NSSet *set = [NSSet setWithArray:array];

看看 Apple 文档参考:
[NSObject isEqual:] https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref /occ/intfm/NSObject/isEqual

[NSSet setWithArray:] https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html#//apple_ref/occ/clm/NSSet/setWithArray

于 2013-10-14T11:29:17.467 回答
0

您正在运行两个快速枚举,就像同一数组的 for 循环一样。这是不正确的。如果要比较坐标,请执行不同数组的循环。如果您仅使用相同的 for 循环,您也可以直接添加到可变数组中。

于 2013-10-14T10:47:25.067 回答
0

如果你想比较数组中的对象,那么我建议你使用 NSSet 而不是 NSArray。

它非常易于使用,您需要以下链接,因为我使用 NSMutableSet 解决了这种情况:

NSSet 教程

于 2013-10-14T10:52:26.920 回答