美文网首页
Objective-C 中文 按拼音全排序

Objective-C 中文 按拼音全排序

作者: 乌龙谦 | 来源:发表于2016-02-24 20:48 被阅读629次

    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

    相关文章

      网友评论

          本文标题:Objective-C 中文 按拼音全排序

          本文链接:https://www.haomeiwen.com/subject/jzgmkttx.html