【问题标题】:How to efficiently extract matching objects from an NSArray? [closed]如何有效地从 NSArray 中提取匹配对象? [关闭]
【发布时间】:2013-10-14 10:17:09
【问题描述】:

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

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

我已经实现了几个可行的解决方案,包括使用 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];                

        }

    }

}

【问题讨论】:

  • 为什么需要多次通行证?检查每个元素一次就足够了。
  • 嗯,这可能是我做错的地方,但是对于数组中的每个项目,我都会检查所有其他项目,看看它是否重复。
  • 匹配 lat,long 但与谁匹配?你想从同一个数组中删除重复的条目吗?
  • 您正在搜索多个对象的匹配项?也许显示一些代码?如果您需要检查多个(且不相关的)值,则需要 O(m*n)。
  • 添加了一些示例代码

标签: ios objective-c performance sorting search


【解决方案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:

【讨论】:

  • 请记住,该集合未排序。这可能在给定的上下文中起作用,但是当哈希不能或不应该那么容易使用时可能会限制一般使用,即当在其他地方使用相同的类并且允许同一位置的多个对象时。
【解决方案2】:

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

【讨论】:

  • 对不起,这是我在伪代码中的错误,我已经更新它以反映我实际在做什么。
  • 为什么只与相同的数组进行比较?我没有得到你想要达到的目标
【解决方案3】:

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

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

NSSet Tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多