如何在最近的日期时间搜索数组

时间:2013-09-21 01:25:54

标签: iphone ios datetime nsarray

我正在尝试构建一个包含待命技术人员姓名的应用程序。我有一个简单的NSArray,它包含以下格式的4个对象;

20130910;0800;John Doe
20130910;1400;Sally Smith
20130910;2000;Jim Jones
20130911;0800;Jane Johnson

上述格式为yyyyMMdd中的日期,2400小时内的时间以及技术人员姓名。

我有两个stings * timeString和* dateString,它们的本地设备的时间和日期与上面的格式相同。

我想搜索数组,查找最近的截止日期/时间,将技术人员姓名分配给新字符串。

使用上面的例子,如果它是9月10日的1600(下午4点),我希望让Sally Smith回来,因为她在1400(下午2点)开始随叫随到。

2 个答案:

答案 0 :(得分:0)

这应该很简单。按照alpha顺序对数组进行排序,这也是日期/时间/名称顺序。

然后,当您有新的日期/时间时,对数组进行二进制搜索,将新的日期/时间字符串与数组中的日期/时间字符串进行比较。通过我的计算,二进制搜索最多可以在log2比较中为您提供正确的项目。

二进制搜索:最大搜索范围。将其设置为要启动的数组的开头/结尾。将数组索引除以2,并将您的字符串与该索引处的项进行比较。如果你的字符串是>该索引处的字符串,将最小搜索范围设置为当前索引。如果字符串是<该数组索引处的字符串,将最大搜索范围设置为新索引。如果等于,则表示您有匹配。

重复上述步骤,直至找到您的商品。 (我太累了,不能准确地说出退出条件。我会把它作为练习留给你。)

答案 1 :(得分:0)

根据技术人员列表的大小,循环可以工作。下面的代码遍历列表,将每个项目分成三个部分(日期,时间,技术人员),计算从现在开始的间隔,并确定哪个是最近/活动的代理(间隔应该是最大的负数)。

为了获得有意义的东西,我改变了数组中的日期。

NSArray *agents = [NSArray arrayWithObjects:
                        @"20130920;0800;John Doe",
                        @"20130920;1400;Sally Smith",
                        @"20130920;2000;Jim Jones",
                        @"20130921;0800;Jane Johnson",nil];

// Setup date formatter
NSDateFormatter* onCallFormatter = [[[NSDateFormatter alloc] init] autorelease];
[onCallFormatter setDateFormat:@"yyyyMMddHHmm"];
[onCallFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

NSTimeInterval mostRecent = -9999999999999;
NSInteger agentIndex;
int i;

for ( i=0; i < [agents count]; i++ ) {
    // Split string into elements
    NSArray *elements = [[agents objectAtIndex:i] componentsSeparatedByString:@";"];

    // Convert date/time into NSDate
    NSDate *onCallDateTime = [onCallFormatter dateFromString:[NSString stringWithFormat:@"%@%@", elements[0], elements[1]]];

    // Calculate the time interval against current date/time
    NSTimeInterval onCallInterval = [onCallDateTime timeIntervalSinceNow];

    // The agent on call would be the one with the largest negative interval
    // onCallInterval should be < 0 (postive would be in the future)
    if ( mostRecent < onCallInterval && onCallInterval < 0) {
        mostRecent = onCallInterval;
        agentIndex = i;
    }
    NSLog( @"%@ on call since %@ - %@ - %f hrs ", elements[2], elements[0], elements[1], onCallInterval/(60*60) );
}

NSLog( @"On call = %@", [agents objectAtIndex:agentIndex] );