Swift拼音排序
...大约 2 分钟Swift
在最近的开发工作中,我需要完成一个排序的功能:把数据按名称排序,思路也很简单,首先把名称转换为拼音,再把拼音按照常规的字母排序即可,于是我找到了如下代码。
let startTime = CFAbsoluteTimeGetCurrent()
var number:Int = 0
results = results.sorted { (value1, value2) -> Bool in
let pinyin1 = value1.name!.transformToPinYin().lowercased()
let pinyin2 = value2.name!.transformToPinYin().lowercased()
number += 1
return pinyin1.compare(pinyin2) == .orderedAscending
}
let endTime = CFAbsoluteTimeGetCurrent()
debugPrint("代码处理\(number)条执行时长:\((endTime - startTime)*1000) 毫秒")
//"代码处理734条执行时长:2005.2640438079834 毫秒"
发现异常耗时,因为转换拼音本来就是一个较慢的工作。
再经过测试后发现sorted中的转换换会执行不止1次,具体排序算法等有空需要进一步分析源码。
实际上在sorted的过程中,转换为拼音其实只需要一次,并不用每次都做重复的转换,所以立即想到了排序前用字典把需要排序的name的拼音存下来,在排序中只需要拿到对应的值就可以了。
let startTime = CFAbsoluteTimeGetCurrent()
var number:Int = 0
var pinyinDict:[UUID:String] = [:]//第二种
for item in results{
pinyinDict[item.id!] = item.name!.transformToPinYin().lowercased()
number += 1
}
let endTime = CFAbsoluteTimeGetCurrent()
debugPrint("拼音处理\(number)条执行时长:\((endTime - startTime)*1000) 毫秒")
results = results.sorted { (value1, value2) -> Bool in
return pinyinDict[value1.id!]!.compare(pinyinDict[value2.id!]!) == .orderedAscending
}
debugPrint("比较时间:\((CFAbsoluteTimeGetCurrent() - endTime)*1000) 毫秒")
//"拼音处理70条执行时长:88.63401412963867 毫秒"
//"比较时间:1.7720460891723633 毫秒"
速度明显大幅度提升。
http://www.rcyd.net/mobnews/16382.html
提到了可以用缓存的方式进行存储,等有可以再优化下。目前每条数据1毫秒的耗时还可以接受。
下另一种优化方案:给数据库中加入拼音字段,这样在排序时可以减少大量工作。