如何在Objective-C中快速搜索对象数组

12

在Objective-C中,如果属性是字符串类型,有没有一种方法可以通过包含的对象的属性来搜索对象数组?

例如,我有一个Person对象的NSArray。 Person有两个属性,NSString *firstName和NSString *lastName。

什么是搜索数组以查找所有在firstName或lastName属性中匹配“Ken”的人的最佳方法?

4个回答

29
尝试像这样做:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName==%@ OR lastName==%@",@"Ken",@"Ken"];
NSArray *results = [allPersons filteredArrayUsingPredicate:predicate];

22

我喜欢你的答案比我的更好。 - progrmr

2
您可以简单地使用NSPredicate从实际结果数组中过滤您的搜索:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.property_name contains[c] %@",stringToSearch];
filteredPendingList = [NSMutableArray arrayWithArray:[mainArr filteredArrayUsingPredicate:predicate]];
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"property_name"
                                                 ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [filteredPendingList sortedArrayUsingDescriptors:sortDescriptors];

因此,您将获得已筛选结果的排序数组。 property_name 是您想要执行搜索操作的对象内变量的名称。希望这能帮到您。


1

你需要进行线性搜索,逐个比较数组中的每个条目,以查看它是否与你要查找的内容匹配。


所有给这个点踩的人,你们是不是认为 NSPredicate 做的不仅仅是线性搜索? - jscs
这不是一个详细的答案,也没有提供示例代码,但它并没有错。使用NSPredicate创建一个完全新的带有过滤结果的数组是一种方法,但是简单地使用for loop遍历数组内容并检查您想要的内容同样好。 - progrmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接