我有一个 NSArray
包含多个本身具有日期范围的对象 NSDate *start
和 NSDate *end
.
我想做的是遍历这个数组以找到最短的范围(在 Start
和 End
之间),基于当前的 date
.像这样:
Date range Start 1 >----------< Date range End 1
Date range Start 2 >-< Date range End 2
|
Current date
在上面的示例中,我想获取包含 Date range start 2
的对象和 Date range End 2
.
关于如何实现这一点有什么想法和建议吗?
更新
基于当前日期我的意思是当前日期应该在范围内的某个地方。我不想要结束日期早于当前日期的范围,也不想要开始日期在未来的范围。
最佳答案
有几个选项,具体取决于您希望结果的深度。第一种(也是最简单的)方法是按最小日期范围对数组进行排序:
array = array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
double a = [obj1.endDate timeIntervalSinceDate:obj1.startDate];
double b = [obj2.endDate timeIntervalSinceDate:obj2.startDate];
if ( a < b ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( a > b ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}
然后,当您需要检查包含今天日期的最短日期时,您可以从数组的开头开始,检查开始日期是否早于现在,结束日期是否晚于现在。符合该条件的第一个对象是您今天周围的最小范围。
NSDate *date = [NSDate date];
Object *foundObject;
for(Object *obj in array)
{
if([obj.startDate timeIntervalSinceDate:date] <= 0 && [obj.endDate timeIntervalSinceDate:date] >= 0)
{
foundObject = obj;
break;
}
}
如果您想更深入地了解,您可以使用谓词来获取围绕今天日期的所有对象的过滤数组。然后您可以获得最短范围和包含您要查找的日期的所有其他范围。
NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
if([evaluatedObject.startDate timeIntervalSinceDate:date] <= 0 && [evaluatedObject.endDate timeIntervalSinceDate:date] >= 0)
{
return true;
}
return false;
}];
NSArray *array = [array1 filteredArrayUsingPredicate:pred];
关于ios - Objective-c:从具有范围的集合(NSArray)中获取最短范围的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336085/