我正在尝试构建一个包含待命技术人员姓名的应用程序。我有一个简单的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点)开始随叫随到。
答案 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] );