IOS数组按中文关键字以字母序排序
2013-07-31 16:47
253 查看
IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门)。
其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。”函数代码我也贴了过来。
[cpp]
view plaincopyprint?
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:,这个函数支持我们自定义一个函数制定比较规则,返回比较结果,这样问题一下便解决了。我先把代码贴出来。
[cpp]
view plaincopyprint?
NSInteger nickNameSort(id user1, id user2, void *context)
{
User *u1,*u2;
//类型转换
u1 = (User*)user1;
u2 = (User*)user2;
return [u1.nickName localizedCompare:u2.nickName
];
}
在需要比较地方,调用比较函数
[cpp]
view plaincopyprint?
sortArr = [arr sortedArrayUsingFunction:nickNameSort context:NULL];
需要的代码很少吧,这样做会有几方面的好处:1 支持多个汉字按字母序排序(若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序)。 2 原本可能需要保存汉字拼音的地方,现在不需要了。 3 可以通过对nickNameSortde进一步定制,完成更复杂的比较,比如先比较会员状态,在按姓名字母序完成比较。4 整体结构简单 使用的都是CocaTouch框架下的的方法。
再感叹一句,CocaTouch你真厉害!!
其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。”函数代码我也贴了过来。
[cpp]
view plaincopyprint?
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:,这个函数支持我们自定义一个函数制定比较规则,返回比较结果,这样问题一下便解决了。我先把代码贴出来。
[cpp]
view plaincopyprint?
NSInteger nickNameSort(id user1, id user2, void *context)
{
User *u1,*u2;
//类型转换
u1 = (User*)user1;
u2 = (User*)user2;
return [u1.nickName localizedCompare:u2.nickName
];
}
在需要比较地方,调用比较函数
[cpp]
view plaincopyprint?
sortArr = [arr sortedArrayUsingFunction:nickNameSort context:NULL];
需要的代码很少吧,这样做会有几方面的好处:1 支持多个汉字按字母序排序(若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序)。 2 原本可能需要保存汉字拼音的地方,现在不需要了。 3 可以通过对nickNameSortde进一步定制,完成更复杂的比较,比如先比较会员状态,在按姓名字母序完成比较。4 整体结构简单 使用的都是CocaTouch框架下的的方法。
再感叹一句,CocaTouch你真厉害!!
相关文章推荐
- IOS数组按中文关键字以字母序排序
- IOS数组按中文关键字以字母序排序
- IOS数组按中文关键字以字母序排序
- IOS数组按中文关键字以字母序排序【转】
- IOS数组按中文关键字以字母序排序
- IOS数组按中文关键字以字母序排序【我的转载】
- iOS数组按中文关键字以字母序排序
- IOS数组按中文关键字以字母序排序(稍后添加 demo)
- IOS数组按中文关键字以字母序排序
- iOS学习 -- 中文按首字母拼音排序
- [iOS]一行代码给中文数组添加索引
- PHP数组以中文首字母来排序
- ios 一个正则表达式测试(只可输入中文、字母和数字)
- 【iOS】汉字数组,按首字母排序
- (iOS开发)判断字符串中是否含有中文,字母
- 解决iOS打印数组和字典中文显示异常问题
- iOS开发小技巧--字典和数组的中文输出
- ios 一个正则表达式测试(只可输入中文、字母和数字)
- ios 一个正则表达式测试(只可输入中文、字母和数字)
- iOS开发之 判断字符串的第一个字符是否是中文或者字母开头