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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • //一、NSString /*----------------创建字符串的方法----------------*/...
    MR_Fany阅读 3,587评论 0 4
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,706评论 0 4
  • 一、 框架: 系统或者第三方事先写好的写很牛X功能的类,把这些类交给我们使用,这些类的集合就叫框架.Foundat...
    _凌浩雨阅读 2,656评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,737评论 18 399
  • 我是达薇,我的三个标签是:1.我是一个时间管理的践行者.是时间管理的合伙人。二:我是抗衰老专家。。三我是一个爱心人...
    达薇知心姐姐阅读 1,333评论 0 0

友情链接更多精彩内容