ios - Objective-c:从具有范围的集合(NSArray)中获取最短范围的最有效方法

标签 ios objective-c algorithm nsarray nspredicate

我有一个 NSArray包含多个本身具有日期范围的对象 NSDate *startNSDate *end .

我想做的是遍历这个数组以找到最短的范围(在 StartEnd 之间),基于当前的 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/

相关文章:

ios - 如何在iphone单独安装的应用程序中打开ppt、excel等文件?

ios - 如何在 NSString 中使用千位分隔符

iphone - 获取透明图像的边界框?

C++ MiniMax算法陷入井字棋板的无限循环

algorithm - 为查询索引 Haskell 数据结构

ios - iOS 上 NSFileHandle 的文件路径(Swift 或 Objective-C)

iOS 关闭键盘,UILabel 故障

ios - afnetworking 3.0 迁移 : how to POST with headers and HTTP Body

ios - 如何使用 YouTube API V3?

c# - 有什么办法可以使它成为更快的算法吗?