我们有许多带标题的对象,我们希望根据标题对它们进行排序。如果我们使用默认搜索方法:
NSArray *sortedObjects = [objects sortedArrayUsingComparator:
^NSComparisonResult(Object* a, Object* b)
{
return [a.title compare:b.title];
}];
它工作正常但是,如果标题中有数字,结果看起来有点奇怪。例如,它将为我们提供如下数组:“Title 1”< “标题10”< “标题2”< ......真正想要的是:“标题1”< “标题2”< “标题10”< ...因此,我们切换到NSNumericSearch
,这正是我们正在寻找的东西。
NSArray *sortedObjects = [objects sortedArrayUsingComparator:
^NSComparisonResult(Object* a, Object* b)
{
return [a.title compare:b.title options:NSNumericSearch];
}];
然后我们遇到了一个很大的性能问题。我们进行了一些分析,并注意到第二种方法比第一种方法慢约35倍。
什么使得数字搜索这么慢?您对如何更快地获得数字排序结果有任何建议吗?
感谢〜
答案 0 :(得分:2)
您对如何更快地获得数字排序结果有什么建议吗?
Sorting is not working correctly中描述了您应该使用的解决方案,即使用-localizedStandardCompare:
对字符串进行排序。该方法将按照用户通常期望的方式对字符串进行排序:
file1
file2
file3
...
file10
file11
来自文档:
只要文件名或其他字符串是,就应该使用此方法 在类似Finder的排序的列表和表格中显示 适当。这种方法的确切排序行为是不同的 在不同的语言环境下,可能会在将来的版本中进行更改。
这个解决方案比现有解决方案更快,更正确,这是一个不错的选择。使用NSNumericSearch
可能会忽略字符串的非数字部分中的差异,因此例如" foo1"出现在" bar2"。
答案 1 :(得分:0)
对不起,我可能误导了很多你们。
我的数字搜索速度较慢的原因是因为我得到的数据集几乎按字母顺序排序。因此,我相信sortedArrayUsingComparator
正在使用的任何搜索算法都已经考虑到了这一点。这就是为什么使用[a.title compare:b.title]
比[a.title compare:b.title options:NSNumericSearch]
更快的原因。但是,它并不总是更快。
以下是我对数据集进行的一些分析。 文字搜索比数字搜索慢。而使用本地化标准比较,它似乎更快。使用21812个对象的相对随机数据集生成结果。