NSMutableArray filterUsingPredicate 仅超过某个索引

Posted

技术标签:

【中文标题】NSMutableArray filterUsingPredicate 仅超过某个索引【英文标题】:NSMutableArray filterUsingPredicate only past a certain index 【发布时间】:2012-02-16 16:55:49 【问题描述】:

我正在尝试使用 filterUsingPredicate 剔除我的 NSMutableArray 元素。

棘手的部分是我总是希望在数组中保留至少 10 个项目,无论它们是否通过谓词测试。所以像:

NSPredicate * cullPredicate = [NSPredicate predicateWithFormat:
        @"distanceFromCurrent <= 25 OR index < 10"];

[self.myArray filterUsingPredicate:cullPredicate];

“OR 索引

这可能与谓词?还是我需要提取另一个元素从 10 开始的数组,应用过滤器,然后将其添加回原始数组?

【问题讨论】:

【参考方案1】:

NSPredicate 有一个-predicateWithBlock: 方法,您可以使用它来执行此操作。像这样的:

NSArray *array = [[self.myArray copy] autorelease];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings)         
    if ([array indexOfObject:evaluatedObject] < 10) return YES;
    return evaluatedObject.distanceFromCurrent <= 25;
];
[self.myArray filterUsingPredicate:predicate];

【讨论】:

应该是-filteredArrayUsingPredicate: 而不是-filterWithPredicate: @RichardJ.RossIII 他说这是一个他试图过滤的 NSMutableArray。 -[NSMutableArray filterUsingPredicate:] 是正确的方法(我复制了他的错误,尽管我认为它看起来不正确)。无论如何,已通过 RichardLovejoy 修复,建议对我的答案进行修改。 是的,我在问题和答案中都进行了编辑,希望它显示出来【参考方案2】:
__block int count = 0;
NSObject * object = myArray[0];
NSPredicate * predicate = [NSPredicate predicateWithBlock:^BOOL(QDItem * evaluatedObject, NSDictionary * bindings) 
    if (object.price == evaluatedObject.price) 
        count ++;
        return YES;
    
    return NO;
];
[myArray filterUsingPredicate:predicate];
NSLog(@"%d", count); // output: 1 if return YES

【讨论】:

以上是关于NSMutableArray filterUsingPredicate 仅超过某个索引的主要内容,如果未能解决你的问题,请参考以下文章

将自定义对象存储到 NSMutableArray,然后将此 NSMutableArray 存储到 NSUserDefaults

访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)

在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray

从 NSData 的 NSMutableArray 转换为 NSString 的 NSMutableArray?

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

NSMutableArray基本概念