アプリのフォーマットの時間をNSString
表すsがあります。mm:ss.SSS
「最速時間」のリストを生成しようとしていますが、これらの番号を並べ替えるために使用するデータ型を把握するのに苦労しています。
これらの文字列を最短から最長の時間で並べ替える最も簡単な方法は何ですか?番号付きのデータ型に変換することでうまくいくと思いますが、どのデータ型を使用する必要がありますか?mm:ss.SSS
フォーマットを保持する必要があります。
アプリのフォーマットの時間をNSString
表すsがあります。mm:ss.SSS
「最速時間」のリストを生成しようとしていますが、これらの番号を並べ替えるために使用するデータ型を把握するのに苦労しています。
これらの文字列を最短から最長の時間で並べ替える最も簡単な方法は何ですか?番号付きのデータ型に変換することでうまくいくと思いますが、どのデータ型を使用する必要がありますか?mm:ss.SSS
フォーマットを保持する必要があります。
NSString
オブジェクトに変換できるオブジェクトがある場合NSDate
(たとえば、適切なオフセットを使用して ISO 8601 形式に変換できると思われます)、オブジェクトのNSArray
インスタンスをNSDate
非常に簡単に並べ替え (例)、そこから選択できます。降順または昇順のどちらでソートしたかに応じて、リストの上部または下部。
このアプローチの利点は、標準の日付処理関数を使用しているため、コードとデバッグが少なくて済むことです。車輪を再発明すると、より迅速な解決策が得られる可能性がありますが、バグが発生する可能性もあります。
文字列が整形式で、先頭にゼロがある場合は、 を形成してNSArray
から を呼び出しsortedArrayUsingComparator:
ます。ただし、12:34.567 や 2:34.567 などの値がある場合、このアプローチは機能しません。double
またはに変換して、秒を格納する必要がありますNSNumber
(つまり、2:34.567 は 154.567 に変換されます)。
これらは NSDate オブジェクトではないことに注意してください。NSDate は特定の瞬間をマークし、これらは単なる期間のように見えます。
を使用すればNSNumber
、引き続き使用できますsortedArrayUsingComparator:
。mm:ss.SSS と NSNumber の間で変換し、再び元に戻すには、NSFormatter のサブクラスを作成する必要があります。
ブロックベースの例については、NSComparator のドキュメントを参照してください。NSFormatter のクラス リファレンスも必要です。GitHubのFormatterKit プロジェクトには、優れた NSFormatter サンプル コードが含まれています。
その目的で(abuse ?)localizedStandardCompare:
を使用することもできます。その方法は、数値に従って文字列に埋め込まれた数値を比較するためです。
NSArray *times = @[ @"11:22.333", @"2:44.555" ];
NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
NSLog(@"%@", sortedTimes);
出力:
(
"2:44.555",
"11:22.333"
)
私のアドバイスは、mm、ss、および SSS のデータ型を表す独自のクラスを作成することです。その後、独自の prettyprint を作成し、データ型のメソッドを比較できます。比較メソッド自体は実装が非常に簡単で、その比較メソッドを使用してそのようなオブジェクトの配列をソートできます。