NSString 的 compare: 对比结果 NSComparisonResult
1、NSOrderedAscending //升序
2、NSOrderedSame //同序
3、NSOrderedDescending //降序
字符串(包括中文)使用 compare: 是按照字符的ASCII值进行比对的。
NSString *a = @"abc";
NSString *b = @"abd";
[a compare:b] == NSOrderedAscending;//(升序)
显然,按照ASCII值排序的不能满足我们 像通讯录那样 将用户名 拼音 然后按照 字母 顺序排序。
之前做一款通讯录软件的时候,采用的是一个三方库 pinyin.c,原理是将汉字转化成拼音,然后根据拼音排序。
缺点:默认只按照拼音第一位排序,如果需要按拼音全排序,还需要自己再去处理。
还有有一个 优化版 PinYin4Objc,这是一个objc库,有以下特征:
1.效率高,使用数据缓存,第一次初始化以后,拼音数据存入文件缓存和内存缓存,后面转换效率大大提高;
2.支持自定义格式化,拼音大小写等等;
3.拼音数据完整,支持中文简体和繁体,与网络上流行的相关项目比,数据很全,几乎没有出现转换错误的问题。
那么除了这两个库,objc 有没有自带方法可以出处理拼音全排序呢?###
我的设想是 Objective-C 不会这么懒。最后终于让我找到了一个方法http://www.lowxp.com/g/article/detail/248
直接上代码
NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; //@"en_US"];
static NSStringCompareOptions comparisonOptions = NSNumericSearch;
NSString *name1 = @"李刚";
NSString *name2 = @"李则";
NSRange string1Range = NSMakeRange(0, [name1 length]);
NSComparisonResult result =[name2 compare:name1 options:comparisonOptions range:string1Range
locale:(NSLocale *)locale];
结果
NSComparisonResult result == NSOrderedDescending //降序
感兴趣的同学 可以自己去写一个通讯录的Demo 去试验一下。
另外如果一个数组保存的是自定义的对象,希望按照对象的一个字段来排序,需要这么写:
//name 是数组对象的 一个属性
namesArray.sortDescriptors = @[
[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
//TODO:处理拼音全排序逻辑
}]];
这段代码的关键在 NSNumericSearch ,这个一个什么排序呢?
说明###
NSCaseInsensitiveSearch= 1
不区分大小写比较
NSLiteralSearch = 2
区分大小写比较
NSBackwardsSearch = 4
从字符串末尾开始搜索
NSAnchoredSearch = 8
搜索限制范围的字符串
NSNumbericSearch = 64
按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt
NSDiacriticInsensitiveSearch = 128
忽略 "-" 符号的比较
NSWidthInsensitiveSearch= 256
忽略字符串的长度,比较出结果
NSForcedOrderingSearch = 512
忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending
NSRegularExpressionSearch = 1024
只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch