0

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

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

上面的格式是 yyyyMMdd 中的日期、2400 小时制的时间和技术人员姓名。

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

我想在数组中搜索最近的过期日期/时间,以将技术人员姓名分配给新字符串。

使用上面的示例,如果是 9 月 10 日的 1600(下午 4 点),我希望 Sally Smith 返回,因为她在 1400(下午 2 点)开始待命。

4

2 回答 2

0

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

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

二分搜索:有一个最大和最小搜索范围。将其设置为要开始的数组的开头/结尾。将数组索引除以 2,并将您的字符串与该索引处的项目进行比较。如果您的字符串 > 该索引处的字符串,请将最小搜索范围设置为当前索引。如果字符串 < 该数组索引处的字符串,则将最大搜索范围设置为新索引。如果它相等,你有一个匹配。

重复上述步骤,直到找到您的项目。(我太累了,无法准确地说明退出条件。我会把它留给你作为练习。)

于 2013-09-21T01:46:56.800 回答
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] );
于 2013-09-21T02:25:58.050 回答