我有NSString
s代表格式在我的應用程序中的時間。我正在嘗試生成一個「最快時間」的列表,我正在努力弄清楚用什麼數據類型來排序這些數字。訂購NSStrings是特定格式的數字(例如3:23.123)?
什麼是最簡單的方法來從最少到最多的時間排序這些字符串?我假設轉換爲一個編號的數據類型會做的伎倆,但我應該使用什麼數據類型?我需要保留格式。
我有NSString
s代表格式在我的應用程序中的時間。我正在嘗試生成一個「最快時間」的列表,我正在努力弄清楚用什麼數據類型來排序這些數字。訂購NSStrings是特定格式的數字(例如3:23.123)?
什麼是最簡單的方法來從最少到最多的時間排序這些字符串?我假設轉換爲一個編號的數據類型會做的伎倆,但我應該使用什麼數據類型?我需要保留格式。
還可以使用(濫用?)localizedStandardCompare:
用於該目的,因爲該方法根據它們的數值進行比較嵌入在字符串中的數字:
NSArray *times = @[ @"11:22.333", @"2:44.555" ];
NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
NSLog(@"%@", sortedTimes);
輸出:
(
"2:44.555",
"11:22.333"
)
謝謝!這樣做的代碼少得多,我認爲我不得不這樣做。 :D – user990769
@ user990769:不客氣! –
如果有NSString
對象可以轉換爲NSDate
對象(如這些,據推測,你可以,例如,使用合適的偏移量轉換成ISO 8601格式),則可以進行排序NSDate
對象的NSArray
實例非常容易(example)並從列表的頂部或底部挑選,具體取決於您是按降序還是升序排序。
這種方法的優點是您正在使用標準日期處理函數,這可能會導致代碼少,調試次數少。重新創建輪子可能會爲您提供更快的解決方案,但它也會引入錯誤。
我沒有考慮使用NSDate的,但是當我試圖格式化我最終得到今天的日期與已進入的UITextField時間一起。我將尋找一個解決方案,但在平均時間你知道如何抑制多餘的最新數據?提前致謝。 – user990769
我的建議是創建自己的類,它代表mm,ss和SSS的數據類型。然後,您可以編寫自己的相紙,並比較數據類型的方法。比較方法本身實現相當簡單,然後可以使用該比較方法對這些對象的數組進行排序。
如果字符串格式良好且前導零,則形成NSArray
,然後調用sortedArrayUsingComparator:
。但是如果你有像12:34.567和2:34.567這樣的值,這種方法將不起作用。您必須將其轉換爲double
或NSNumber
,存儲秒(即2:34.567轉換爲154.567)。
請注意,這些不是NSDate對象。一個NSDate標記一個特定的瞬間,這些似乎只是持續時間。
如果使用NSNumber
,仍然可以使用sortedArrayUsingComparator:
。你必須寫一個NSFormatter的子類,在mm:ss.SSS和NSNumber之間進行轉換,然後再返回。
見一個blocks-based example爲NSComparator的文檔。您還需要NSFormatter的類參考。 FormatterKit project on GitHub有一些很好的NSFormatter示例代碼。
你太親近了。 'sortedArrayUsingComparator:'是矯枉過正,如果你只是想默認的比較;你可以用'sortedArrayUsingSelector:'和'比較:'。正確的答案是:'sortedArrayUsingComparator:',比較器向其中一個字符串發送'compare:options:',要求它比較自己和其他數字*('NSNumericSearch'選項),它處理12-vs -2正確的情況。 –
假設SSS代表微秒,爲什麼不把整個值轉換成微秒。 – Till