本文转载至 http://blog.csdn.net/xunyn/article/details/7882087

IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门)。

其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。”函数代码我也贴了过来。

  1. char pinyinFirstLetter(unsignedshort hanzi)
  2. {
  3. int index = hanzi - HANZI_START;
  4. if (index >= 0&& index <= HANZI_COUNT)
  5. {
  6. return firstLetterArray[index];
  7. }
  8. else
  9. {
  10. return hanzi;
  11. }
  12. }

这个方法真是用很原理的东西,解决一个巧妙问题,但也存在一个问题:不支持汉字(首字)的第二个字母的排序,据说映射的char数组会很大。这里我给出我的方法,先在CocoaTouch框架上看看有什么能用到的,在NSString有一个函数localizedCompare:,它的功能是通过自身与给定字符串的比较,返回一个本地化的比较结果,也就是说这个函数是支持汉字比较的。
    进一步localizedCompare:只是字符串与字符串的比较,我们要让NSArray数组通过按关键字为汉字字符串排序,我们继续在NSArray的SDK上下功夫,我们发现除了sortdArrayUsingDescriptors:通过NSSortDescriptor排序;还有sotedArrayUsingFunction:context:,这个函数支持我们自定义一个函数制定比较规则,返回比较结果,这样问题一下便解决了。我先把代码贴出来。

  1. NSInteger nickNameSort(id user1, id user2, void *context)
  2. {
  3. User *u1,*u2;
  4. //类型转换
  5. u1 = (User*)user1;
  6. u2 = (User*)user2;
  7. return  [u1.nickName localizedCompare:u2.nickName
  8. ];

在需要比较地方,调用比较函数

  1. sortArr = [arr sortedArrayUsingFunction:nickNameSort context:NULL];

需要的代码很少吧,这样做会有几方面的好处:1 支持多个汉字按字母序排序(若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序)。 2 原本可能需要保存汉字拼音的地方,现在不需要了。 3 可以通过对nickNameSortde进一步定制,完成更复杂的比较,比如先比较会员状态,在按姓名字母序完成比较。4 整体结构简单 使用的都是CocaTouch框架下的的方法。
再感叹一句,CocaTouch你真厉害!!

IOS数组按中文关键字以字母序排序的更多相关文章

  1. JavaScript对象数组根据某属性sort升降序排序

    1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [    {name: "Bruce", age: 23, id: 16 ...

  2. 浅谈JavaScript对象数组根据某属性sort升降序排序

    1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16, s ...

  3. iOS - 数组字典模型根据模型属性key排序

    方法一: NSArray *sortArray = [arrayM sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { ...

  4. java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序

    package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...

  5. 在PHP中,将一个汉字数组按照拼音首字母进行排序

    (之前发的这篇博文因为含有敏感关键字,只好重发一遍了) <?php $str = "我们可以在浏览器中看到,当鼠标移到元素上时,元素开始向右移动,开始比较慢,之后则比较快,移开时按原曲 ...

  6. js中实现中文按字母拼音排序

    js中实现中文按字母拼音排序 var Pinyin = (function (){ var Pinyin = function (ops){ this.initialize(ops); }, opti ...

  7. [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}

    IOS数组.字典.NSNumber 新写法—— @[].@{}   //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...

  8. iOS数组使用

    相关链接: ios数组基本用法和排序 NSArray 排序汇总 iOS 数组排序方法 IOS-筛选数组内的元素 关于EnumerateObjectsUsingBlock和for-in之间的较量 [iO ...

  9. sqlservice 查询该字段的值是否为数字、不包含a-z字母、获取中文的首字母

    select zjm from xskh where guid_yw='e6ee44f3-98ab-4446-bd9b-db2e525d3b24' and zjm not like  '%[ABCDE ...

随机推荐

  1. 双击Table表格td变成text修改内容

    //先不多说这里上我的页面 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)

    一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...

  3. 终端应用变身文件 MD5/SHA1 校验工具

    担心下载的文件被恶意篡改?没有找到 Mac 平台文件校验工具?其实 Mac OS X 系统中已经内置了“文件 MD5/SHA1 校验工具”,它就藏身于终端(Terminal)应用中! 打开终端应用,输 ...

  4. 【redis】存入redis的值,如果为null是否默认不被存入

    存入redis的值,如果为null是否默认不被存入

  5. Android内存泄露自动检测神器LeakCanary

    经典的面试题: a.怎样在coding过程中避免内存泄露? b.怎样检测内存泄露? 这两个问题我想大部分Android 职位面试时都会被问到吧. 怎样避免就不赘述了,网上很多答案. 工具呢,当然也有很 ...

  6. mac使用xampp中自带phpmyadmin连接单独安装mysql

    1 在xampp安装目录中找到phpadmin目录,编辑config.inc.php权限,赋予读写权限 2 打开config.inc.php $cfg['Servers'][$i]['user'] = ...

  7. Data Leakage 因果性

    参考这篇: https://blog.csdn.net/jiandanjinxin/article/details/54633475 再论数据科学竞赛中的Data Leakage 存在和利用这种倒‘因 ...

  8. 【魅族Pro7】——BootStrap/JQuery/Canvas/PHP/MySQL/Ajax爬坑之项目总结

    前言:这个项目是我们小组团体合作完成的学习项目,项目使用魅族GUI设计和图片素材,响应式重构Pro7官网的首页.子页.商城及购物车,并加入一些创新.我主要负责的是[画屏子页]的项目,这里作为温故知新, ...

  9. 分布式数据库中间件–(1) Cobar初始化过程

    Cobar-Server的源代码地址:GitHub 欢迎Fork. 官方文档描写叙述Cobar的网络通信模块见下图. Cobar使用了Java的NIO进行处理读写.NIO是Java中的IO复用.而不须 ...

  10. mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析

    1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...