使用NSPredicate过滤NSArray

时间:2013-05-31 08:21:03

标签: ios objective-c nsarray nspredicate

我有一个包含字符串的数组。其中一些字符串可能为空(@“”)。谓词必须如何看起来过滤数组并返回一个只包含非空字符串的新数组:

阵列A:{“A”,“B”,“”,“D”} - >过滤器 - >数组B:{“A”,“B”,“D”}

它也应该返回:

数组A:{“”,“”,“”,“”} - >过滤器 - >数组B:{}

3 个答案:

答案 0 :(得分:10)

如果您只过滤SELF != ''数组,请使用谓词NSString。这匹配每个NSString,它不完全等于空字符串。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF != ''"];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];

示例代码:

NSArray *array = @[@"A", @"B", @"", @"C", @"", @"D"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF != ''"];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"Input array: %@\nFiltered array: %@", [array componentsJoinedByString:@","], [filteredArray componentsJoinedByString:@","]);

提供此输出

Input array: A,B,,C,,D
Filtered array: A,B,C,D

编辑:Joris Kluivers发布了谓词格式为length > 0的解决方案。这可能是解决空字符串的更好解决方案,因为它可能会更快。

答案 1 :(得分:7)

检查字符串的长度:

NSArray *values = @[@"A", @"B", @"", @"D"];
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"length > 0"];

NSArray *filteredValues = [values filteredArrayUsingPredicate:filterPredicate];

所需数组("A", "B", "C")

中的结果

答案 2 :(得分:-1)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c]%@",searchText];

[arrSearched removeAllObjects];

[arrSearched addObjectsFromArray:[self.arrContent filteredArrayUsingPredicate:predicate]];

这里arrContent是原始数组,arrSearched是搜索后的输出数组。