gpt4 book ai didi

ios - 在字符串数组中查找最近的日期

转载 作者:行者123 更新时间:2023-11-28 19:31:02 24 4
gpt4 key购买 nike

所以,我得到了一个排序的 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...

更新

所以人们问我我尝试做什么。所以是这样的(不是很有效,但是有效)

  1. 查找今天是否在数组中(如果是,则返回)
  2. 循环日期:

    2.1 将dateString转换为date

    2.2 比较date是否大于today => 如果是则返回

  3. 如果在第 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];

这看起来不太好,因为我可能会重新加载日期数组。我能有更好的解决方案吗?

最佳答案

您的算法还不错,尽管您的代码似乎没有实现它(不是吗?)。如果您想改进它,请考虑以下事项:

首先,进行第一次扫描以检查精确匹配可能没有什么意义 - 这可能是通过无序数组的线性搜索(由 indexOfObject: 实现),如果它失败了,你必须再次扫描以获得接近的匹配,只需同时进行。

其次,排序没有优势,最多为 O(NlogN),因为线性搜索 O(N) 会找到您需要的答案。

这是一个草图:

  1. 将您要搜索的日期从 NSString 转换为 NSDate,将其命名为 target
  2. bestMatch,一个NSString设置为nil。将 bestDelta(一个 NSTimeInterval)设置为最大可能值 DBL_MAX
  3. 遍历您的 dates 数组:

    3.1。将字符串日期转换为 NSDate,比如 date

    3.2。将 delta 设置为 datetarget

    之间的差异

    3.3。如果 delta 为零,则表示完全匹配,返回它

    3.4。如果 delta 优于 bestDelta,则更新 bestDeltabestMatch

  4. 迭代后 bestMatch 是最佳匹配,如果没有匹配则为 nil

这是一个单一的迭代,O(N),精确匹配的早期返回。

HTH

关于ios - 在字符串数组中查找最近的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com