NSArray 查找一个或多个对象 - 最佳实践[关闭]

2024-06-28

解决方案:我已将 @BlackRider 的答案标记为正确,因为它是最通用的,特别是对于复杂的比较,但是还有其他非常好的答案和评论。我鼓励任何有相同或类似问题的人查看它们并评估适合您的具体情况的最佳行动方案。

在我的情况下,我实际上没有在实现中使用 BlackRider 的解决方案。在 @JoshCaswell 的评论以及 @voromax 的建议的帮助下,我选择使用我自己的解决方案(请参阅下面的编辑#2)indexesOfObjectsWithOptions:passingTest:因为在这种情况下我的比较非常简单。

感谢所有回答并提供见解的人。


我正在寻找一种有效的方法来从NSArray基于该对象的属性(在本例中是唯一标识符)。在 C#.NET 中使用 Linq 我会做类似的事情

MyObject obj = myList.Single(o => o.uuid == myUUID);

我还想知道是否有一种有效的方法来获取与非唯一属性匹配的对象数组。再次,使用 Linq 它看起来像

List<MyObject> objs = myList.Where(o => o.flag == true).ToList();

当然,我可以编写循环来执行此操作,但它们不可重用,而且我对它们的性能表示怀疑。

查找具有唯一 ID 的对象:

-(MyObject*)findObjectWithUUID:(NSString*)searchUUID{
    for (MyObject* obj in _myArray){
        if([obj.uuid isEqualToString: searchUUID])
            return obj;
    }
}

查找对象数组:

-(NSArray*)findObjectsWithFlag:(BOOL)f{
    NSMutableArray* arr = [NSMutableArray array];
    for (MyObject* obj in _myArray){
        if(obj.flag == f)
            [arr addObject:obj];
    }
    return arr;
}

- 编辑 -

幸运的是,在第一种情况下,我正在寻找的对象有一个唯一的标识符,而且我知道只会有一个。我想出了一个在我的对象上实现 isEqual 的解决方案,该解决方案将由indexOfObject:

- (BOOL)isEqual:(id)object{
    return [self.uuid isEqualToString: ((MyObject*)object).uuid];
}

然后创建一个“假”查找对象并使用它来查找真实的查找对象

MyObject *lookupObject = [[MyObject alloc] init];
lookupObject.uuid = searchUUID;
MyObject *actualObject = 
    [_myArray objectAtIndex:[_myArray indexOfObject:lookupObject]];

这本质上与我上面发布的 for-in 循环相同,但可能更具可读性且更可重用。当然,这仅适用于查找一个唯一的对象,并不能解决我问题的后半部分。

-- 编辑 2 --

检查Class并实施hash正如评论中推荐的那样。

- (BOOL)isEqual:(id)object{
    return [object isKindOfClass:[MyObject class]] && 
           [self.uuid isEqualToString: ((MyObject*)object).uuid];
}

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

您可以使用[NSPredicate],它为您提供了类似查询的搜索语法。查看这一页 https://developer.apple.com/library/mac/documentation/cocoa/conceptual/predicates/Articles/pCreating.html用于谓词语法描述。这是一个简单的例子:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"propertyName == %@", @"value"];
NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate];

至于性能,我认为您的解决方案是可以的,因为数组中的任何搜索都需要迭代所有元素,然后对于每个对象,将字段的值与您搜索的值进行比较。您可以优化相同数据中的重复搜索,例如通过创建并填充一个字典,将某个字段的值映射到匹配对象(或对象集合,如果映射是一对多)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSArray 查找一个或多个对象 - 最佳实践[关闭] 的相关文章

随机推荐