如何使用 NSPredicate 过滤这些 NSArray?

Posted

技术标签:

【中文标题】如何使用 NSPredicate 过滤这些 NSArray?【英文标题】:How to filter these NSArray with NSPredicate? 【发布时间】:2013-10-01 08:02:39 【问题描述】:
-(void) vUpdateHistoryAndSuggestionEntries

    NSArray * potentialHistory = [[self class] arHistory];

potentialHistory 是 NSString 对象的数组。

我想以不区分大小写的方式仅过滤以@"Cat" 开头的元素。例如,

如果 NSArray 包含

凯茜 猫 狗

然后我想要一个包含的数组

凯茜 猫

我认为 NSPredicate 非常适合这个。任何其他方式也可以。

有类似的问题。但是,在这些问题中, NSArray 包含字典。我想根据数组的实际元素而不是数组元素的元素进行过滤。

【问题讨论】:

【参考方案1】:
NSArray *yourArray;
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'C'"];
NSArray *theFilteredArray = [yourArray filteredArrayUsingPredicate:aPredicate];

希望这会对您有所帮助。

【讨论】:

【参考方案2】:

这是一个如何使用 NSPredicate 的示例:

NSArray *sampleArray = @[@"Cathy", @"Cat", @"Dog"];
NSArray *filteredSampleArray = [sampleArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self contains[c] %@",@"ca"]];
NSLog(@"%@",filteredSampleArray);

这将输出:

( 凯茜, 猫 )

【讨论】:

【参考方案3】:
NSString *filterStr = [NSString stringWithFormat:@"name LIKE[c] '*%1$@*'",searchStr];
NSPredicate *predicate = [NSPredicate predicateWithFormat:filterStr];
NSMutableArray *tempArray = [yourArrayofNames filteredArrayUsingPredicate:predicate];

//这里 name 是你的属性,yourArrayofNames 是你的对象数组。

【讨论】:

【参考方案4】:

您不需要 NSPredicate 来解决这个问题。

for (NSString* item in arHistory)

    if ([item rangeOfString:@"cat" options:NSCaseInsensitiveSearch].location == 0)//occurs at beginning

        [potentialHistory addObject:item];
    

编辑:如果 potentialHistory 是不可变的,请使用另一个数组来存储这些和init potentialHistory。

NSArray* potentialArray = [NSArray arrayWithArray:(NSArray*)array]

【讨论】:

没错,您不需要NSPredicate。但这是不好的做法。 我明白了。有什么具体原因吗?

以上是关于如何使用 NSPredicate 过滤这些 NSArray?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 NSPredicate 过滤 Core Data 托管对象?

iPhone如何使用NSPredicate按父实体过滤Core Data?

如何使用 NSPredicate 从另一个 NSMutableArray 中过滤 NSMutableArray

如何根据多对关系集是不是包含特定值使用 NSPredicate 进行过滤

如何制作正确过滤本地字符的 NSPredicate?

如何使用 NSFetchedResultsController 设置过滤指定组中项目的 NSPredicate