我有NSString
s 代表mm:ss.SSS
我的应用程序中格式的时间。我正在尝试生成一个“最快时间”列表,并且我正在努力弄清楚要使用哪些数据类型来订购这些数字。
将这些字符串从最少到最多时间排序的最简单方法是什么?我假设转换为编号数据类型可以解决问题,但我应该使用什么数据类型?我需要保留mm:ss.SSS
格式。
我有NSString
s 代表mm:ss.SSS
我的应用程序中格式的时间。我正在尝试生成一个“最快时间”列表,并且我正在努力弄清楚要使用哪些数据类型来订购这些数字。
将这些字符串从最少到最多时间排序的最简单方法是什么?我假设转换为编号数据类型可以解决问题,但我应该使用什么数据类型?我需要保留mm:ss.SSS
格式。
如果您有NSString
可以转换为对象的NSDate
对象(例如,您可以使用合适的偏移量将其转换为 ISO 8601 格式),那么您可以非常轻松地NSArray
对对象实例进行排序(示例)并从中挑选列表的顶部或底部,具体取决于您是按降序还是升序排序。NSDate
这种方法的优点是您使用的是标准日期处理函数,这可能会导致更少的代码和更少的调试。重新发明轮子可能会为您提供更快的解决方案,但也可能会引入错误。
如果字符串格式正确,带有前导零,则形成 anNSArray
然后调用sortedArrayUsingComparator:
. 但是如果你有像 12:34.567 和 2:34.567 这样的值,这种方法就行不通了。您必须转换为double
或NSNumber
,存储秒数(即 2:34.567 转换为 154.567)。
请注意,这些不是 NSDate 对象。NSDate 标记了一个特定的时间瞬间,这些似乎只是持续时间。
如果你使用NSNumber
,你仍然可以使用sortedArrayUsingComparator:
。您必须编写 NSFormatter 的子类,以便在 mm:ss.SSS 和 NSNumber 之间进行转换并再次返回。
有关基于块的示例,请参阅 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 的数据类型。然后,您可以为数据类型编写自己的漂亮打印和比较方法。compare 方法本身实现起来相当简单,然后您可以使用该 compare 方法对此类对象的数组进行排序。