【发布时间】:2017-06-28 18:20:41
【问题描述】:
所以,我有一个已排序的NSArray,其中包含NSString 对象(从服务器下载),格式为:yyyy-MM-dd。
差不多是这样的:
NSArray <NSString *> *dates = @[@"2017-06-25",
@"2017-06-26",
@"2017-06-27",
@"2017-06-28",
@"2017-06-30",
@"2017-07-01",
@"2017-07-02",
@"2017-07-03"];
所以,今天是 2017-06-29,它不在数组中。如何获得下一个最近的?在这个示例中是 06-30,但如果 06-30 不存在,它可能是 07-01...
更新
所以人们都在问我我试图做什么。所以就是这样(不是很有效,但是工作)
- 查找今天是否在数组中(如果是,则返回)
-
循环日期:
2.1 将
dateString转换为date2.2 比较
date是否大于today=>如果是则返回 如果在第 2 步中没有找到,则返回日期数组中的最后一个对象。
实际代码:
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd";
NSDate *today = [NSDate date];
NSUInteger index = [dates indexOfObject:[formatter stringFromDate:today]];
// Step 1
if (index == NSNotFound) {
// Step 2: Loop converted
NSInteger i = 0;
for (NSString *date in dates) {
// Step2.1: find the next nearest date's index
NSDate *convertedDate = [formmater dateFromString:date];
// Step2.2: Compare
if ([convertedDate intervalSinceDate:today] > 0) {
index = i;
break;
}
i++;
}
// Step 3: Still not found, index = last index
if (index == NSNotFound) index = i-1;
}
return dates[index];
这看起来不太好,因为我可能会重新加载日期数组。我能有更好的解决方案吗?
【问题讨论】:
-
到目前为止你尝试过什么?请添加您的代码。一种简单的方法是遍历数组并计算两个日期之间的时间。存储差异最小的日期。当然,如果您知道列表是预先排序的,那么您可以进行明显的优化(忽略检查日期之前的任何日期,并忽略除检查日期之后差异最小的日期之外的任何日期)。
-
NSDateFormatter至少将日期转换为NSDate。那么,您到底在寻找什么?未来最接近?过去最接近?最接近什么?你有什么尝试? -
@RoboticCat 我不知道如何找到它。在我的代码中,我只是检查是否找到了今天。数组已排序。你认为我必须将整个数组转换为
NSDate,今天添加,再次排序然后找到最近的吗? -
@Larme 要求查找下一个最近的,即未来
-
@Eddie 定义“更好”的答案。只是因为它循环了两次,所以在你看来它“更慢”。伙计,为您的代码降低一些指标。查看内存和时间使用情况,然后回过头来说明为什么您的解决方案或其他解决方案更糟。下面列出的答案很好,可以完成工作。
标签: ios objective-c optimization nsarray