0

我有NSStrings 代表mm:ss.SSS我的应用程序中格式的时间。我正在尝试生成一个“最快时间”列表,并且我正在努力弄清楚要使用哪些数据类型来订购这些数字。

将这些字符串从最少到最多时间排序的最简单方法是什么?我假设转换为编号数据类型可以解决问题,但我应该使用什么数据类型?我需要保留mm:ss.SSS格式。

4

4 回答 4

2

如果您有NSString可以转换为对象的NSDate对象(例如,您可以使用合适的偏移量将其转换为 ISO 8601 格式),那么您可以非常轻松地NSArray对对象实例进行排序(示例)并从中挑选列表的顶部或底部,具体取决于您是按降序还是升序排序。NSDate

这种方法的优点是您使用的是标准日期处理函数,这可能会导致更少的代码和更少的调试。重新发明轮子可能会为您提供更快的解决方案,但也可能会引入错误。

于 2012-12-28T21:53:19.913 回答
1

如果字符串格式正确,带有前导零,则形成 anNSArray然后调用sortedArrayUsingComparator:. 但是如果你有像 12:34.567 和 2:34.567 这样的值,这种方法就行不通了。您必须转换为doubleNSNumber,存储秒数(即 2:34.567 转换为 154.567)。

请注意,这些不是 NSDate 对象。NSDate 标记了一个特定的时间瞬间,这些似乎只是持续时间。

如果你使用NSNumber,你仍然可以使用sortedArrayUsingComparator:。您必须编写 NSFormatter 的子类,以便在 mm:ss.SSS 和 NSNumber 之间进行转换并再次返回。

有关基于块的示例,请参阅 NSComparator 的文档。您还需要 NSFormatter 的类参考。GitHub 上的FormatterKit 项目有一些不错的 NSFormatter 示例代码。

于 2012-12-29T00:25:30.500 回答
1

你也可以使用 (abuse ?)localizedStandardCompare:来达到这个目的,因为该方法会根据它们的数值比较嵌入在字符串中的数字:

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

输出:

(
    "2:44.555",
    "11:22.333"
)
于 2012-12-29T10:46:12.520 回答
0

我的建议是创建自己的类来表示 mm、ss 和 SSS 的数据类型。然后,您可以为数据类型编写自己的漂亮打印和比较方法。compare 方法本身实现起来相当简单,然后您可以使用该 compare 方法对此类对象的数组进行排序。

于 2012-12-28T21:53:34.857 回答