NSMutableArray和NSPredicate过滤
我试图过滤我的数组中的两个实体,如我有一个Person对象,其中我有姓名,地址,号码,电子邮件等我试图过滤我的对象名称和数字的对象数组列表。 如何使用NSPredicate来实现?
创build谓词(以下假定您的Person
类具有name
和number
string属性):
NSString *nameFilter = @"Steve*"; NSString *numberFilter = @"555-*"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];
然后,过滤数组(假定你有一个NSArray
的Person
对象):
NSArray *personArray = /* obtain from somewhere */; NSArray *filtered = [personArray filteredArrayUsingPredicate:pred];
结果将是一个包含Person
对象的数组,其name
可以是“Steve”,“Steven”等,其编号以555-
。
编辑
你所说的话没有意义。 你不能从一个类中删除属性(或者说,你不应该 )。 如果你只是想要一个只包含名字和数字的数组,你必须遍历Person
对象的数组:
NSMutableArray *result = [NSMutableArray array]; for (Person *p in personArray) [result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]];
我相信你正在寻找:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name];
或者如果你想要string名称的相似性,你也可以使用:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];
并假设电话号码只是一个整数,你可以使用==,<,<=等等进行号码比较
然后将其应用于:
NSArray * filteredarray = [array filteredArrayUsingPredicate:predicate];
我更喜欢使用CONTAINS
字进行过滤。 做这个工作很容易。 或者你可以把它们结合在一起:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];
你可以参考官方DOC :
开始:左手expression从右手expression开始。
包含:左边的expression式包含右边的expression式。
完成:左手expression式以右手expression式结束。
喜欢:左手expression等于右手expression: 和*允许作为通配符,在哪里? 匹配1个字符,*匹配0个或更多字符。
匹配:根据ICU v3,左手expression式使用正则expression式比较等于右手expression式(更多细节参见ICU用户指南中的正则expression式)。
NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"]; NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];
feedType
是要比较的Custom对象的属性, arrayTotalFeed
是Custom对象的数组。