查找最小时间间隔(从现在到数组之间的日期)

时间:2014-01-23 04:10:14

标签: ios objective-c arrays

目前正在努力寻找最佳解决方案,以找到当前时间与数组内部日期之间的最小时间间隔。

我有一个接受NSArray并返回NSArray的方法。该方法执行以下操作:

  1. 按时间排序的数组循环(0索引最接近当前时间)
  2. 通过查找增量和比较来查找最小间隔
  3. 抓取该索引,获取它,返回字典
  4. 我开始使用timeIntervalSinceDate等来代替我在下面使用的手动工作。

    数组看起来像这样:

    tideSummary: [{
    
    'type' : 'High Tide',
    'pretty' : 'January 16 at 5:13PM EST',
    'epoch' : '325267782',
    
    ...
    
    }]
    

    这段代码看起来是不是很臃肿?我觉得根据索引和键值提取某些数据有很大的重复次数吗?

    我想从数组返回最接近的时间,所以我想使用timeIntervalSince1970并做一些简单的数学运算来找到最小的delta。我的数组包含一个以毫秒为单位返回时间的键


    有关如何清理条件的任何建议,我仍然可以提取:lowTideTime - highTideTimetideType

    以下是我用来提取此信息的方法:

    - (NSArray *)findUpcomingTides: (NSArray *)arrayOfTideCycles {
        NSTimeInterval currentDateInterval;
        currentDateInterval = [[NSDate date]timeIntervalSince1970];
        NSInteger smallestDelta = currentDateInterval;
        NSArray *upcomingTideData = [[NSArray alloc] init];
    
        for (NSInteger i = 0; i < arrayOfTideCycles.count; i++) {
    
            NSDictionary *eachTideSummary = [arrayOfTideCycles objectAtIndex:i];
            NSInteger tideDateAsEPOCH = [[eachTideSummary valueForKeyPath:@"epoch"] intValue];
            NSInteger dateDelta = tideDateAsEPOCH - smallestDelta;
            if (dateDelta < smallestDelta) {
                smallestDelta = dateDelta;
    
                int iPlusOne = i+1;
    
                upcomingTide = [arrayOfTideCycles objectAtIndex:i];
                NSDictionary *tideTypeDictionary = [arrayOfTideCycles objectAtIndex:i];
                tideType = [tideTypeDictionary objectForKey:@"type"];
    
                if([[upcomingTide valueForKeyPath:@"type"] isEqualToString:@"Low Tide"] || [[upcomingTide valueForKeyPath:@"type"] isEqualToString:@"Max Ebb"]){
    
                    NSString *lowTidePrettyDateFormat = [upcomingTide valueForKeyPath:@"pretty"];
                    lowTideTime = [self convertAndFormatDateToTimeWithString:lowTidePrettyDateFormat];
    
    
                    NSDictionary *upcomingHighTide = [arrayOfTideCycles objectAtIndex:iPlusOne];
                    NSString *highTidePrettyDateFormat = [upcomingHighTide valueForKeyPath:@"pretty"];
                    highTideTime = [self convertAndFormatDateToTimeWithString:highTidePrettyDateFormat];
    
                } else {
    
                    NSString *highTidePrettyDateFormat = [upcomingTide valueForKeyPath:@"pretty"];
                    highTideTime = [self convertAndFormatDateToTimeWithString:highTidePrettyDateFormat];
    
                    NSDictionary *upcomingLowTide = [arrayOfTideCycles objectAtIndex:iPlusOne];
                    NSString *lowTidePrettyDateFormat = [upcomingLowTide valueForKeyPath:@"pretty"];
                    lowTideTime = [self convertAndFormatDateToTimeWithString:lowTidePrettyDateFormat];
                }
    
                upcomingTideData = [NSArray arrayWithObjects:lowTideTime, highTideTime, tideType, nil];
            }
        }
    
        return upcomingTideData;
    }
    

    关于我如何清理它的任何建议?

2 个答案:

答案 0 :(得分:0)

我理解你不喜欢的问题是在这种并行性中违反DRY:

NSString *lowTidePrettyDateFormat = [upcomingTide valueForKeyPath:@"pretty"];
lowTideTime = [self convertAndFormatDateToTimeWithString:lowTidePrettyDateFormat];
NSDictionary *upcomingHighTide = [arrayOfTideCycles objectAtIndex:iPlusOne];
NSString *highTidePrettyDateFormat = [upcomingHighTide valueForKeyPath:@"pretty"];
highTideTime = [self convertAndFormatDateToTimeWithString:highTidePrettyDateFormat];

NSString *highTidePrettyDateFormat = [upcomingTide valueForKeyPath:@"pretty"];
highTideTime = [self convertAndFormatDateToTimeWithString:highTidePrettyDateFormat];
NSDictionary *upcomingLowTide = [arrayOfTideCycles objectAtIndex:iPlusOne];
NSString *lowTidePrettyDateFormat = [upcomingLowTide valueForKeyPath:@"pretty"];
lowTideTime = [self convertAndFormatDateToTimeWithString:lowTidePrettyDateFormat];

据我所知,乍一看,它们完全相同(除了一些不重要的局部变量名称)。因此,将它们分解为一个方法,该方法取upcomingTide值并返回两个潮汐时间的数组(或者这两个代码应该为您生成的任何内容)。

答案 1 :(得分:0)

一些建议:

valueForKeyPath是一种非常通用且复杂的方法,运行速度相对较慢; objectForKey会更快。

如果您的数组包含以毫秒为单位的数据,那么您的代码就会出现问题。 intValue仅处理大约+/- 20亿之间的值。 20亿毫秒= 200万秒=一个月多一点。使用longLongValue或doubleValue。 (如果您的数据实际上是几秒钟,那么您的代码将在2038年左右出错)。

我不确切地知道你要做什么,但是这个

    NSInteger dateDelta = tideDateAsEPOCH - smallestDelta;
    if (dateDelta < smallestDelta) {
        smallestDelta = dateDelta;

错了。只需使用调试器逐步完成它,看看值是如何变化的。而且我相信你会想要在那里某处获得绝对价值。

如果最后一个数组元素给出最小的增量,您的代码将崩溃,因为您将进一步访问数组元素超出数组。

如果您说过10,000个数组元素,前五千个元素和当前日期之后五千个元素元素,那么到目前为止,您将找到最佳元素五千次,并且每次执行重要工作。我首先找到最好的数组元素,当找到它时,获取你想要的数据。