2012-12-28 38 views
0

我有NSString s代表格式在我的應用程序中的時間。我正在嘗試生成一個「最快時間」的列表,我正在努力弄清楚用什麼數據類型來排序這些數字。訂購NSStrings是特定格式的數字(例如3:23.123)?

什麼是最簡單的方法來從最少到最多的時間排序這些字符串?我假設轉換爲一個編號的數據類型會做的伎倆,但我應該使用什麼數據類型?我需要保留格式。

+0

假設SSS代表微秒,爲什麼不把整個值轉換成微秒。 – Till

回答

1

還可以使用(濫用?)localizedStandardCompare:用於該目的,因爲該方法根據它們的數值進行比較嵌入在字符串中的數字:

NSArray *times = @[ @"11:22.333", @"2:44.555" ]; 
NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 
NSLog(@"%@", sortedTimes); 

輸出:

(
    "2:44.555", 
    "11:22.333" 
) 
+0

謝謝!這樣做的代碼少得多,我認爲我不得不這樣做。 :D – user990769

+0

@ user990769:不客氣! –

2

如果有NSString對象可以轉換爲NSDate對象(如這些,據推測,你可以,例如,使用合適的偏移量轉換成ISO 8601格式),則可以進行排序NSDate對象的NSArray實例非常容易(example)並從列表的頂部或底部挑選,具體取決於您是按降序還是升序排序。

這種方法的優點是您正在使用標準日期處理函數,這可能會導致代碼少,調試次數少。重新創建輪子可能會爲您提供更快的解決方案,但它也會引入錯誤。

+0

我沒有考慮使用NSDate的,但是當我試圖格式化我最終得到今天的日期與已進入的UITextField時間一起。我將尋找一個解決方案,但在平均時間你知道如何抑制多餘的最新數據?提前致謝。 – user990769

0

我的建議是創建自己的類,它代表mm,ss和SSS的數據類型。然後,您可以編寫自己的相紙,並比較數據類型的方法。比較方法本身實現相當簡單,然後可以使用該比較方法對這些對象的數組進行排序。

1

如果字符串格式良好且前導零,則形成NSArray,然後調用sortedArrayUsingComparator:。但是如果你有像12:34.567和2:34.567這樣的值,這種方法將不起作用。您必須將其轉換爲doubleNSNumber,存儲秒(即2:​​34.567轉換爲154.567)。

請注意,這些不是NSDate對象。一個NSDate標記一個特定的瞬間,這些似乎只是持續時間。

如果使用NSNumber,仍然可以使用sortedArrayUsingComparator:。你必須寫一個NSFormatter的子類,在mm:ss.SSS和NSNumber之間進行轉換,然後再返回。

見一個blocks-based example爲NSComparator的文檔。您還需要NSFormatter的類參考。 FormatterKit project on GitHub有一些很好的NSFormatter示例代碼。

+0

你太親近了。 'sortedArrayUsingComparator:'是矯枉過正,如果你只是想默認的比較;你可以用'sortedArrayUsingSelector:'和'比較:'。正確的答案是:'sortedArrayUsingComparator:',比較器向其中一個字符串發送'compare:options:',要求它比較自己和其他數字*('NSNumericSearch'選項),它處理12-vs -2正確的情況。 –