繁体   English   中英

NSMutableArray和NSPredicate过滤

[英]NSMutableArray and NSPredicate filtering

我试图用一个对象中的两个实体来过滤我的数组,就像我有一个Person对象,其中我有名字,地址,数字,电子邮件等。我试图用名称和数字过滤我的数组对象列表。 如何使用NSPredicate实现这一目标?

创建谓词(以下假设您的Person类具有namenumber字符串属性):

NSString *nameFilter = @"Steve*";
NSString *numberFilter = @"555-*";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];

然后,过滤数组(假设您有一个Person对象的NSArray ):

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];

或者如果你想要字符串名称的相似之处,你也可以使用:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];

假设电话号码只是一个int,您可以使用==,<,<=等进行数字比较

然后应用它:

NSArray * filteredarray  = [array filteredArrayUsingPredicate:predicate];

我更喜欢使用CONTAINS字来进行过滤。 这项工作很容易。 或者你可以将它们组合在一起:

NSPredicate * predicate =
 [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];

你可以参考官方DOC

BEGINSWITH:左手表达式以右手表达式开头。

CONTAINS:左手表达式包含右手表达式。

ENDSWITH:左手表达式以右手表达式结束。

LIKE:左手表达式等于右手表达式:? 和*被允许作为通配符,在哪里? 匹配1个字符,*匹配0个或更多个字符。

匹配:根据ICU v3,左手表达式使用正则表达式比较等于右手表达式(有关详细信息,请参阅ICU用户指南中的正则表达式)。

NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];

NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];

feedType是要比较的Custom对象的属性, arrayTotalFeed是Custom对象的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM