2013-09-21 58 views
0

我正在嘗試構建一個包含通話技術人員姓名的應用程序。我有一個簡單的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(4PM),我期待讓Sally Smith回來,因爲她在1400(2PM)開始了她的隨叫隨到。

+0

你到目前爲止嘗試過什麼,它不起作用。請顯示你的代碼。 – Drew

+0

已編輯的代碼。一探究竟。 – hasan83

回答

0

這應該很簡單。按照字母順序對數組進行排序,這也將是日期/時間/名稱順序。

然後,當您有新的日期/時間時,對數組執行二進制搜索,將新的日期/時間字符串與數組中的日期/時間字符串進行比較。通過我的計算,二分查找會最多給你log2比較中的正確項目。

二進制搜索:有一個最大最小搜索範圍。將其設置爲數組的開始/結尾以開始。將數組索引除以2,並將您的字符串與該索引處的項目進行比較。如果您的字符串>該索引處的字符串,請將最小搜索範圍設置爲當前索引。如果該字符串是該數組索引處的字符串<,請將最大搜索範圍設置爲新索引。如果它相等,你有一場比賽。

重複上述步驟直到找到您的物品。 (我太累了無法準確地說出退出條件,我將把它作爲練習留給你。)

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]);