【问题标题】:Filter NSArray of NSNumber with NSArray of NSNumber with NSPredicate使用 NSPredicate 过滤 NSNumber 的 NSArray 和 NSNumber 的 NSArray
【发布时间】:2013-08-23 21:58:45
【问题描述】:

我有这个自定义类:

@interface MyModel : NSObject

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

@end

流派数组是NSNumbers 的数组。我用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 在过滤后应该包含对象m2 和m3。我可以用NSPredicate 做到这一点吗?如果是这样,怎么做?还是有别的办法?

【问题讨论】:

  • 你想要包含任意个给定数组元素的对象,还是所有个给定数组元素?
  • 所有元素,如果可能的话......

标签: ios objective-c nsarray nspredicate


【解决方案1】:

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

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

NSArray *result = [myArray filteredArrayUsingPredicate: allPred];

此谓词将查找包含 所有 类型的 MyModels,这些类型包含在您的 a 数组中。对于您的测试数据,这将是 ID 为 259 和 25932as 的两个对象。

【讨论】:

  • 确实,这是 SUBQUERY 的一个更简单的替代方案。 (事实证明,皮耶罗需要“任何”解决方案,但问题并不清楚。)
【解决方案2】:

要在给定数组a 中查找具有至少一种类型的对象,请使用

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

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

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

(这个想法是检查给定数组中的流派数量是否相等 到数组的大小。)

【讨论】:

  • 我试过了,但是好像不行:(你试过了吗?
  • @Piero:是的,我用你的代码试了一下,它返回了m2 和m3。
  • @Piero:好的,我会更新答案(应该更容易)。
  • 最后一个问题,如果要检查的数组是 NSString 而不是 NSNumber?,那么流派它是一个 NSString 数组,其中包含 int 字符串,而“a”数组仍然是一个 NSNumber 数组有可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多