中文首字母 排序

简介:

因项目需要对通讯录中的联系人进行排序,需要对中文字符进行拼音转换。其实这个转换并没有想象中的那么难(因为我们只是把中文转为拼音首字母而已,比如“王”转换为字母w就可以了,而不需要转换为完整的拼音wang)。对此,我们找到了一个简便的解决办法:一个老外(代码中签名的作者叫George)用c语言写了一个pinyinFirstLetter函数用于获取中文拼音首字母。

这个函数主要基于一个巨大的c语言char数组,把unicode字符集中所有中文的拼音首字母都映射进去了。

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

就这样,有这个char数组为基础,一切都变得非常简单:

char pinyinFirstLetter(unsignedshort hanzi)

{

int index = hanzi - HANZI_START;

if (index >= 0&& index <= HANZI_COUNT)

{

returnfirstLetterArray[index];

}

else

{

return hanzi;

}

}

至于排序,我们可以把要排序的中文(为简便起见,我们假设这些要排序的中文都只有一个字)放到NSArray中,然后利用NSArray的sortedArrayUsingComparator:方法进行排序即可。sortedArrayUsingComparator:方法是NSArray内部元素的比较方法。你只需要为这个方法提供一个块作为参数即可。然后在这个块中,对两个元素的大小进行比较,并返回一个NSComparisonResult(NSComparisonResult枚举用于表示比较的结果:等于、小于、大于):

NSArray *sortedArray=[mArray sortedArrayUsingComparator:^(id a, id b) {

            char c1=pinyinFirstLetter([(NSString*)a characterAtIndex:0]);

            char c2=pinyinFirstLetter([(NSString*)b characterAtIndex:0]);

            NSString* s1=[[NSStringstringWithFormat:@"%c",c1] uppercaseString];

            NSString* s2=[[NSStringstringWithFormat:@"%c",c2] uppercaseString];

            return [s1 compare:s2];

        }];

目录
相关文章
|
1月前
正则表达式匹配中文
正则表达式匹配中文
25 1
hutool 判断字符串是否全部为字母组成,包括大写和小写字母和汉字
hutool 判断字符串是否全部为字母组成,包括大写和小写字母和汉字
|
8月前
输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符
输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符
写几个正则表达式:只允许输入汉字、数字、字母、中英文小括号,并且10个字符以内|只允许输入汉字、数字、字母、英文小括号|电话号码正则表达式
写几个正则表达式:只允许输入汉字、数字、字母、中英文小括号,并且10个字符以内|只允许输入汉字、数字、字母、英文小括号|电话号码正则表达式
170 0
|
数据采集 Java 开发工具
Java正则表达式匹配aabb、abab格式字符
我们开发过程中,经常用到正则表达式来匹配想要的字符串,或者从一段文本中提取想要的关键字,比如爬虫应用等。正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅java里面可以用,其他的语言也一样适用。
346 0
Java正则表达式匹配aabb、abab格式字符
正则表达式 - 最常用正则表达式大全(数字、字符、特殊)
正则表达式 - 最常用正则表达式大全(数字、字符、特殊)
610 0
|
开发者 Python
特殊字母的含义 | 学习笔记
快速学习 特殊字母的含义
142 0
|
存储 Shell 程序员
字符和字符串|学习笔记
快速学习字符和字符串
66 0
字符和字符串|学习笔记
|
Shell Linux Perl
Shell的正则表达式入门、常规匹配、特殊字符:^、$、.、*、字符区间(中括号):[ ]、特殊字符:\、匹配手机号
Shell的正则表达式入门、常规匹配、特殊字符:^、$、.、*、字符区间(中括号):[ ]、特殊字符:\、匹配手机号
Shell的正则表达式入门、常规匹配、特殊字符:^、$、.、*、字符区间(中括号):[ ]、特殊字符:\、匹配手机号
输入一行字符串将其中的单词替换成另一单词
输入一行字符串将其中的单词替换成另一单词
157 0