Swift拼音排序

Jiaolong...大约 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.htmlopen in new window

提到了可以用缓存的方式进行存储,等有可以再优化下。目前每条数据1毫秒的耗时还可以接受。

下另一种优化方案:给数据库中加入拼音字段,这样在排序时可以减少大量工作。