Objective-C 中文 按拼音全排序

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 ,这个一个什么排序呢?

《Objective-C 中文 按拼音全排序》 NSStringCompareOptions

说明###

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

    原文作者:乌龙谦
    原文地址: https://www.jianshu.com/p/874ad2eb67a0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞