目前正在努力寻找最佳解决方案,以找到当前时间与数组内部日期之间的最小时间间隔。
我有一个接受NSArray并返回NSArray的方法。该方法执行以下操作:
0
索引最接近当前时间)我开始使用timeIntervalSinceDate
等来代替我在下面使用的手动工作。
数组看起来像这样:
tideSummary: [{
'type' : 'High Tide',
'pretty' : 'January 16 at 5:13PM EST',
'epoch' : '325267782',
...
}]
这段代码看起来是不是很臃肿?我觉得根据索引和键值提取某些数据有很大的重复次数吗?
我想从数组返回最接近的时间,所以我想使用timeIntervalSince1970
并做一些简单的数学运算来找到最小的delta。我的数组包含一个以毫秒为单位返回时间的键
有关如何清理条件的任何建议,我仍然可以提取:lowTideTime
- highTideTime
和tideType
以下是我用来提取此信息的方法:
- (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;
}
关于我如何清理它的任何建议?
答案 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个数组元素,前五千个元素和当前日期之后五千个元素元素,那么到目前为止,您将找到最佳元素五千次,并且每次执行重要工作。我首先找到最好的数组元素,当找到它时,获取你想要的数据。