用NSNrray的NSArray和NSPredicate过滤NSNr的NSNrray

时间:2013-08-23 21:58:45

标签: ios objective-c nsarray nspredicate

我有这个自定义类:

@interface MyModel : NSObject

@property (nonatomic,strong) NSString *id_name;
@property (nonatomic,strong) NSArray *genres;

@end

genres数组是NSNumber s的数组。我使用MyModel对象填充另一个数组,例如:

MyModel *m = [[MyModel alloc] init];
m.id_name = @"2345";
m.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:3],[NSNumber numberWithInt:5],nil];

MyModel *m2 = [[MyModel alloc] init];
m2.id_name = @"259";
m2.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],nil];

MyModel *m3 = [[MyModel alloc] init];
m3.id_name = @"25932as";
m3.genres = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],[NSNumber numberWithInt:15],nil];

myArray = [NSArray arrayWithObjects:m,m2,m3,nil];

现在我要过滤myArray,以便类型包含在此数组的元素中:

NSArray *a = [NSArray arrayWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:10],nil];

因此,myArray在过滤后应包含对象m2m3。我可以使用NSPredicate执行此操作吗?如果是这样,怎么样?或者还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

Martin R提供了一个优雅的答案,但如果我理解你的问题,你也可以使用更简单的谓词:

NSPredicate *allPred = [NSPredicate predicateWithFormat: @"ALL %@ IN genres", a];

NSArray *result = [myArray filteredArrayUsingPredicate: allPred];

此谓词将找到包含<{1}}数组中包含的所有类型的MyModel个。对于测试数据,这将是具有ID a259的两个对象。

答案 1 :(得分:0)

要查找给定数组a至少一个类型的对象,请使用

[NSPredicate predicateWithFormat:@"ANY genres in %@", a];

要查找给定数组中具有所有类型的对象,需要使用SUBQUERY:

[NSPredicate predicateWithFormat:@"SUBQUERY(genres, $g, $g IN %@).@count = %d", a, [a count]];

(想法是检查给定数组中的类型数是否相等 到数组的大小。)