IOS数组按中文关键字以字母序排序
IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门)。
其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。”函数代码我也贴了过来。
- char pinyinFirstLetter(unsignedshort hanzi)
- {
- int index = hanzi - HANZI_START;
- if (index >= 0&& index <= HANZI_COUNT)
- {
- return firstLetterArray[index];
- }
- else
- {
- return hanzi;
- }
- }
这个方法真是用很原理的东西,解决一个巧妙问题,但也存在一个问题:不支持汉字(首字)的第二个字母的排序,据说映射的char数组会很大。这里我给出我的方法,先在CocoaTouch框架上看看有什么能用到的,在NSString有一个函数localizedCompare:,它的功能是通过自身与给定字符串的比较,返回一个本地化的比较结果,也就是说这个函数是支持汉字比较的。
进一步localizedCompare:只是字符串与字符串的比较,我们要让NSArray数组通过按关键字为汉字字符串排序,我们继续在NSArray的SDK上下功夫,我们发现除了sortdArrayUsingDescriptors:通过NSSortDescriptor排序;还有sotedArrayUsingFunction:context:,这个函数支持我们自定义一个函数制定比较规则,返回比较结果,这样问题一下便解决了。我先把代码贴出来。
- NSInteger nickNameSort(id user1, id user2, void *context)
- {
- User *u1,*u2;
- //类型转换
- u1 = (User*)user1;
- u2 = (User*)user2;
- return [u1.nickName localizedCompare:u2.nickName
- ];
- }
在需要比较地方,调用比较函数
- sortArr = [arr sortedArrayUsingFunction:nickNameSort context:NULL];
需要的代码很少吧,这样做会有几方面的好处:1 支持多个汉字按字母序排序(若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序)。 2 原本可能需要保存汉字拼音的地方,现在不需要了。 3 可以通过对nickNameSortde进一步定制,完成更复杂的比较,比如先比较会员状态,在按姓名字母序完成比较。4 整体结构简单 使用的都是CocaTouch框架下的的方法。
再感叹一句,CocaTouch你真厉害!!
IOS数组按中文关键字以字母序排序相关推荐
- JS数组对象——英文按照首字母进行排序sort()、localeCompare()
JS数组对象--英文按照首字母进行排序(sort.localeCompare) 上期回顾 场景复现 sort()方法与localeCompare 实例应用 上期回顾 文章内容 文章链接 JS数组对象- ...
- 如何利用一维数组实现二维数组的多列自由升降序排序过程详解
如何利用一维数组实现二维数组的多列自由升降序排序过程详解 本例只说明多列排序的实现方式,一维数组的排序已经有过讲解不在赘述.所以本文是在已经完成了一维数组排序的函数封装的基础上完善多列排序的过程的详解 ...
- 一个排列是某些对象的有序组合,例如,3124 就是数字 1,2,3,4 的一种可能排列。 如果所有的排列按照数值或者字母序排序,我们称其为一个字典序。 0, 1, 2 的字典排列有:012 021 1
字典排列 一个排列是某些对象的有序组合,例如,3124 就是数字 1,2,3,4 的一种可能排列. 如果所有的排列按照数值或者字母序排序,我们称其为一个字典序. 0, 1, 2 的字典排列有:012 ...
- PHP二维数组按照中文姓名首字母排序
方法一: 直接排序不返回首字母 $old_list = $this->model->field('id, number, username, mobile')->where('xxx ...
- 数组根据某字段首字母拼音排序并返回新的数组
原本的数组长这样: const data = [{name: '测试数据1',sortName: '一个需要排序的数据'},{name: '测试数据2',sortName: '二个需要排序的数据'} ...
- java 字母序排序,Java -------- 首字母相关排序总结
Java 字符串数组首字母排序 字符串数组按首字母排序:(区分大小写) String[] strings = new String[]{"ba","aa",&q ...
- 中文select按照字母a-z排序
<select><option value="65">超人总动员</option><option value="64" ...
- Hadoop实现词频统计(按照词频降序排列以及相同词频的单词按照字母序排列)
Hadoop实现词频统计(按照词频降序排列以及相同词频的单词按照字母序排列) 一.环境 二.实现步骤 1.数据 2.主函数 3.第一个MapReduce Map Reduce 4.第二个MapRedu ...
- iOS--中文排序、全拼音排序
本文示例Demo在GitHub:https://github.com/gaussli/ChineseSortDemo 在做项目的时候,总遇到排序问题,英文排序是很简单的,直接使用compare方法就可 ...
最新文章
- android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式
- 10.3 在线学习与 MapReduce-机器学习笔记-斯坦福吴恩达教授
- 斯坦福大学机器学习第八课“神经网络的表示(Neural Networks: Representation)”
- Koa(1)之——koa入门
- 好文|张一鸣:10年面试2000人,我发现混的好的人,全都有同一个特质
- source insight 支持lua /ruby
- 阴阳师人数最多的服务器,《阴阳师》手游部分服务器合并公告
- jpush java api_JPush極光推送Java服務器端API
- linux系统有几个系统盘,linux操作系统的分区有哪些种类?各分区主要作用是什么?...
- 下一代云原生应用制品管理平台,容器镜像服务企业版优惠进行时
- [HNOI2011]数学作业 题解
- cd oracle home/dbs,Oracle专家高级编程学习笔记
- SQL笛卡尔积查询的典型应用
- 主板usb接口全部失灵_usb接口没反应,主板usb接口全部失灵
- 计算机系统机构中的八个伟大思想
- 关于html表格结构标签thead,tfoot,tbody使用出现不兼容性
- 计数器+按钮控制数码管显示
- 多数据中心架构,异地多活架构
- KMP Seek the Name,Seek the Fame
- 网络类型(P2P、MA、BMA、NBMA)
热门文章
- PDA服务器显示响应为空,jmeter 状态码为200,但是响应数据为何为空
- python乱码怎么办_python中输出中文乱码怎么解决
- oracle上浮下浮分析函数_Oracle分析函数简析
- java 泛型 类型实参(type argument)
- python \__call__
- D3 scaleQuantize
- D3 updateenterexit
- Pycharm TensorFolw配置
- 虚拟机打不开,提示“此主机不支持虚拟化实际模式”的解决方法。
- java发送post请求json格式_Linux QT 4G发送HTTP POST请求发送JSON格式的数据