如何找到ARRAY的索引位置,其中NSPredicate选择值。我使用filteredArrayUsingPredicate作为过滤器

时间:2013-03-27 19:21:29

标签: ios objective-c nspredicate

这是一个根据当前时间过滤具有开始时间和结束时间的数组的示例。这很好用:

问题:但是在这里我想知道collectionArr的索引位置,其中谓词选择值。

NSDate* currentDate = [NSDate date];
NSDateFormatter *_formatter = [[[NSDateFormatter alloc] init] autorelease];
[_formatter setLocale:[NSLocale currentLocale]];
[_formatter setDateFormat:@"yyyy-MM-dd hh:mm a"];

NSString *_date=[_formatter stringFromDate:currentDate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"StartDate <= %@ AND EndDate = %@", _date, _date];
if (shortPrograms.count > 0) {
    [shortPrograms removeAllObjects]; 
}

//collectionArr have multiple dictionaries ,which has start date and end date.  
//collectionArr = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"..Sdate..",@"Startdate",@"..Edate..",@"Enddate", nil], nil]; 
//shortPrograms is a filter are, having the date in between start date and end date.

[shortPrograms addObjectsFromArray:[collectionArr filteredArrayUsingPredicate:predicate]];

3 个答案:

答案 0 :(得分:2)

您的shortPrograms数组包含来自collectionArr的对象的子集。听起来你想要从shortPrograms获取一个对象,并确定它来自collectionArr的位置。

一般情况下你不能。但如果collectionArr中的所有对象都是唯一的,那么就有可能。

id someObject = shortPrograms[someIndex]; // get some value
NSUInteger originalIndex = [collectionArr indexOfObject:someObject];

如果collectionArr中的对象不是唯一的,那么这将无效,因为无法知道您正在处理哪些重复项。

答案 1 :(得分:2)

如果要根据某些比较从数组中获取索引,则应使用indicesOfObjectsPassingTest:而不是谓词。您似乎想要查找结束时间与当前日期(包括时间)相同的对象的索引。仅当键EndDate的值是NSDate对象而不是字符串时,这才有效。此外,假设您的开始日期始终与结束日期相同或更早,则没有理由检查开始时间,只检查结束日期。这就是你如何使用我上面提到的方法:

NSIndexSet *indxs = [collectionArr indexesOfObjectsPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
        return (fabs([dict[@"EndDate"] timeIntervalSinceNow]) < 10);
    }];
NSLog(@"%@",indxs);

这将返回任何字典的索引,其中键EndDate的值小于当前时间和日期的10秒。

答案 2 :(得分:0)

从我的小知识来看,不可能NSPredicate

NSPredicate中没有可用于返回索引位置的方法。

您可能必须实施自己的逻辑才能实现目标。